2011-12-05 54 views
0

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

下面是一些简单的代码

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

我敢肯定,有一些基本的东西,我只是没有看不到。

回答

2

首先,你不应该忽略像你这样的例外。

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

使用调试器。它会帮助你找到这些问题的原因。

+0

啊哈!好大声,我实际上正在处理例外情况,我只是简化了一些代码。该修复最后非常简单,例如serverResponse.write(clientOutput),它应该是serverResponse.println(clientOutput),再次感谢! – PDStat