Java TCP套接字块readLine
问题描述:
我的客户端始终阻塞在br.readLine()。我试图添加“\ n”,但它没有解决问题。还有一个字符数组阻塞,当我只使用读取而不是readLine。Java TCP套接字块readLine
谁能帮帮我?
CLIENT
/** Benutzereingabe einlesen **/
BufferedReader brEingabe = new BufferedReader(new InputStreamReader(System.in));
String send = brEingabe.readLine();
Socket socket = new Socket(host, port);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pr = new PrintWriter(socket.getOutputStream());
pr.println(send);
pr.flush();
System.out.println(br.readLine()); // is blocking
socket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
服务器
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
//ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept(); // blockiert bis Anfrage kommt
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String zeile;
while ((zeile = br.readLine()) != null) {
System.out.println(zeile);
if (zeile.isEmpty()) break;
}
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.write("Hallo\n");
pw.flush();
pw.close();
socket.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
答
你所写的代码做到这一点:
客户写一个行,然后尝试读取之一。
服务器读取多行,直到它获得一个空行或结束流。然后写一行。
的问题是,服务器正在等待客户端做的,它是不会做一些事情:
客户端将不会发送一个空行(除非它读一个从标准输入),
客户端将不会关闭流......直到它从服务器获得响应。
因此客户端正在等待服务器和服务器正在等待客户端。僵局。
有多种方法可以解决这个问题。一个简单的方法是改变这一点(在客户端)
println(send);
这个
println(send); println();
然而,这里的一个问题是,你的“协议”不符合的情况下应付想要发送作为数据的空行。这是因为你隐式地使用了一条空行(来自客户端)来表示“消息完成”。
好吧,这解决了这个问题,但服务器如何读取多行? – Max 2015-02-10 22:16:10
查看我的更新... – 2015-02-10 22:17:14
我将println(发送)更改为pr.println(send +“\ n”);现在没关系。 zeile.isEmpty()检查最后是否有“\ n”?我真的不明白它是如何工作的 – Max 2015-02-10 22:27:24