ServerSocket接受继续阻止

时间:2011-12-05 21:29:51

标签: java sockets

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

这是一些简化的代码

@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());

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

1 个答案:

答案 0 :(得分:2)

首先,你不应该忽视像你一样的异常。

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

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