Java 读线()上的BufferedReader阻塞
由于某些原因,我无法从服务器上的客户端读取行。客户端可以毫无问题地发送行,但服务器不会超过第一次调用clientIn.readLine()时的。我认为它是阻塞,但我不知道如何处理它 当我发送没有服务器端循环的行时,也会发生这种情况 Client.javaJava 读线()上的BufferedReader阻塞,java,sockets,bufferedreader,printwriter,Java,Sockets,Bufferedreader,Printwriter,由于某些原因,我无法从服务器上的客户端读取行。客户端可以毫无问题地发送行,但服务器不会超过第一次调用clientIn.readLine()时的。我认为它是阻塞,但我不知道如何处理它 当我发送没有服务器端循环的行时,也会发生这种情况 Client.java public void run() { try { socket = new Socket(ip, port); System.out.println("Client connected on port
public void run()
{
try {
socket = new Socket(ip, port);
System.out.println("Client connected on port: " + socket.getRemoteSocketAddress());
//wrap streams for ease
BufferedReader serverIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter serverOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
System.out.println("starting messages");
//send messages
serverOut.println("hello from: " + socket.getLocalSocketAddress());
serverOut.println("msg1: " + this.hashCode());
serverOut.println("msg2: final test");
//close the connection
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Server.java:
public void run()
{
System.out.println("Server Running on port: " + serverSocket.getLocalPort());
while(true)
{
try {
//listen for connections
Socket client = serverSocket.accept();
//record sockets
connections.put(client.getRemoteSocketAddress(), client);
//wrap streams for ease
BufferedReader clientIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter clientOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));
//send messages
String line = null;
while((line = clientIn.readLine()) != null)
{
System.out.println(line);
}
//ends the connection
client.close();
System.out.println("Client disconnected");
} catch (IOException e) {
e.printStackTrace();
}
}
}
您需要flush()
您的serverOut
writer,否则您的消息将留在BufferedWriter的缓冲区中,并且永远不会发送到服务器
socket.close();
您正在关闭应关闭PrintWriter
的套接字:
serverOut.close();
当您从下方关闭插座时,
PrintWriter
中的缓冲数据正在丢失。我知道PrintWriter有一个用于发送数据的内部缓冲区,但它自己需要多长时间才能发送数据。或者它会一直等着你刷新吗?它不仅是PrintWriter,还是BufferedWriter。时间并不重要。PrintWriter和BufferedWriter仅在其缓冲区已满时写入。请参阅javadoc。那么关闭套接字将终止连接并关闭iostreams,但不将缓冲区中的数据刷新到远程端?