[英]Java cannot read and write to socket at the same time
我正在尝试使用Java套接字构建一个简单的多客户端聊天应用程序。 我这样做的方法是让客户端类连接到服务器类,该服务器类等待客户端连接并创建一个新线程来处理该客户端(在其中读取和写入套接字连接)。 客户端还读取和写入与此线程的套接字连接。 但是,当客户端写入套接字的输出流时,服务器将不会响应。 这里发布了一个类似的问题:
这里的答案之一是,您可以同时读取和写入套接字,只要在单独的线程中完成对套接字的读取即可。
这是我的客户应用程序:
public class Client {
Socket socket;
public static void main(String[] args) {
new Client();
}
public Client() {
try {
socket = new Socket("localhost", 4444);
new Thread() {
@Override
public void run() { //read from the input stream
try(
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
) {
String line;
while( (line = in.readLine()) != null ) {
System.out.println("Server said: " + line);
}
} catch(IOException e) {
}
}
}.start();
//write to output stream
try(
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner userInput = new Scanner(System.in);
){
System.out.println("Enter Something: ");
if(userInput.hasNextLine()) {
out.println(userInput.nextLine());
}
} catch (IOException e) {
}
} catch(IOException e) {
}
}
}
而我的服务器应用程序:
public class Server {
ServerSocket ss;
public static void main(String[] args) {
new Server();
}
public Server() {
System.out.println("Server Running...");
try {
ss = new ServerSocket(4444);
while(true) {
Socket socket = ss.accept();
new Thread() { //create new thread connection to client
@Override
public void run() {
new Thread() { //thread that reads inputstream
@Override
public void run() {
try(
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
) {
String line;
while( (line = in.readLine()) != null ) {
System.out.println("Client said: " + line);
//The problem seems to lie here.
}
} catch(IOException e) {
}
}
}.start();
//write to outputstream
try (
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
) {
String sendToClient = "Hey, my name is Server007 B)";
out.println(sendToClient);
} catch(IOException e) {
}
}
}.start();
}
} catch (IOException e) {}
}
}
我将运行服务器,然后运行客户端,在客户端输出
Server said: Hey, my name is Server007
Enter something:
Hello! <- enter anything
但服务器不打印“客户说:您好!” 就像我期望的那样。 我希望我的问题已经足够清楚了,谢谢。
好的,所以我弄清楚了,如果有人犯同样的错误,我将回答我自己的问题。 PrintWriter构造函数应为:
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
不是这个:
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
或者,我可以这样做:
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
我一定对BufferedWriter和PrintWriter:P感到困惑
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.