ServerSocket принимает продолжает блокировать - PullRequest
0 голосов
/ 06 декабря 2011

У меня возникли проблемы с симуляцией соединения с моим сокетом сервера, кажется, что 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());

Я уверен, что есть нечто фундаментальное, чего я просто не вижу.

1 Ответ

2 голосов
/ 06 декабря 2011

Прежде всего, вы не должны игнорировать исключения, как вы делаете.

Проблема не в том, чтобы принять. Проблема в том, что сервер использует readLine(), и клиент никогда не отправляет символ EOL и никогда не закрывает сокет. Таким образом, сервер заблокирован в ожидании появления EOL в считывателе. То же самое верно для клиента: он использует readLine() и сервер никогда не отправляет EOL.

Используйте отладчик. Это поможет вам найти причину таких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...