Java ServerSocket接受继续阻止
我在模拟与服务器套接字的连接时遇到一些问题,accept似乎继续阻塞,因为它没有“看到”连接 下面是一些简化的代码Java ServerSocket接受继续阻止,java,sockets,Java,Sockets,我在模拟与服务器套接字的连接时遇到一些问题,accept似乎继续阻塞,因为它没有“看到”连接 下面是一些简化的代码 @Test public void testPDMServerThread() { try { ServerSocket serverSocket = new ServerSocket(0); int port = serverSocket.getPort(); Socket clien
@Test
public void testPDMServerThread() {
try {
ServerSocket serverSocket = new ServerSocket(0);
int port = serverSocket.getPort();
Socket clientSocket = new Socket("localhost", port);
PrintWriter clientRequest = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader serverResponse = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
serverThread = new ProducerMonitorServerThread(serverSocket.accept());
clientRequest.write("Hi!");
serverThread.start();
System.out.println("Server says: " + serverResponse.readLine());
assertEquals("RUNNABLE", serverThread.getState().toString());
} catch (IOException e) {
}
}
这是服务器应该响应的线程
public class ProducerMonitorServerThread extends Thread {
private Socket socket;
public ProducerMonitorServerThread(Socket socket) {
super("PDM");
this.socket = socket;
}
@Override
public void run() {
try {
PrintWriter serverResponse = new PrintWriter(socket.getOutputStream(), true);
BufferedReader clientRequest = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String serverInput, clientOutput;
while((serverInput = clientRequest.readLine()) != null) {
clientOutput = "Bye!";
System.out.println("Client says: " +serverInput);
serverResponse.write(clientOutput);
}
serverResponse.close();
clientRequest.close();
socket.close();
} catch (IOException e) {
}
}
}
它似乎永远不会越过这条线,这就是为什么我认为accept没有看到这种联系
serverThread = new ProducerMonitorServerThread(testServer.accept());
我确信有一些基本的东西我只是没有看到。首先,你不应该像现在这样忽略异常 问题不在于接受。问题是服务器使用
readLine()
,客户端从不发送任何EOL字符,也从不关闭套接字。因此,服务器被阻塞,等待读卡器中出现EOL。客户端也是如此:它使用readLine()
,服务器从不发送任何EOL
使用调试器。它将帮助您找到此类问题的原因。Aha!好的,我实际上是在处理异常,我只是删掉了一些代码来简化它。最后,修复非常简单,例如,没有使用serverResponse.write(clientOutput)它应该是serverResponse.println(clientOutput),再次感谢!