gpt4 book ai didi

java - ServerSocket接受继续阻塞

转载 作者:行者123 更新时间:2023-12-02 08:04:23 24 4
gpt4 key购买 nike

我在模拟与服务器套接字的连接时遇到一些问题,accept 似乎继续阻塞,因为它没有“看到”连接。

这是一些简化的代码

@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) {
}
}
}

它似乎永远不会越过这条线,这就是为什么我认为接受没有看到连接

serverThread = new ProducerMonitorServerThread(testServer.accept());

我确信有一些基本的东西我只是没有看到。

最佳答案

首先,您不应该像现在这样忽略异常。

问题不在于接受。问题是服务器使用readLine(),而客户端永远不会发送任何EOL字符,也永远不会关闭套接字。因此,服务器被阻塞,等待 EOL 出现在阅读器中。对于客户端来说也是如此:它使用 readLine() 并且服务器从不发送任何 EOL。

使用调试器。它将帮助您找到此类问题的原因。

关于java - ServerSocket接受继续阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com