我的客户端始终在br.readLine()处阻止。我试图添加“\ n”,但它没有解决问题。当我只使用read而不是readLine时,char数组也会被阻塞。
谁能帮帮我?
客户
/** 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();
}
}
SERVER
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();
}
答案 0 :(得分:2)
您编写的代码执行此操作:
客户端写入一行,然后尝试读取一行。
服务器读取多行,直到它获得空行或流末尾。然后它写了一行。
问题是服务器正在等待客户做一些它不会做的事情:
客户不会发送空行(除非它从标准输入中读取一行),
客户端无法关闭流...直到它从服务器获得响应。
因此,客户端正在等待服务器,服务器正在等待客户端。死锁。
有多种方法可以解决这个问题。一种简单的方法是改变它(在客户端)
println(send);
到这个
println(send); println();
然而,这里的一个问题是你的"协议"不应对案件想要发送空行作为数据。那是因为你隐含地使用空行(来自客户端)来表示"消息已完成"。