2012-08-29 184 views
0

我在尝试从套接字读取InputStream时遇到阻塞问题。
这里是服务器端的代码:
Java TCP套接字

public static void main(String[] args) throws Exception { 
    if (args.length != 1) { 
     throw new IllegalArgumentException("Parameter : <Port>"); 
    } 

    int port = Integer.parseInt(args[0]); // Receiving port 

    ServerSocket servSock = new ServerSocket(port); 
    String s; 
    Socket clntSock = servSock.accept(); 
    System.out.println("Handling client at " 
      + clntSock.getRemoteSocketAddress()); 
    in = new BufferedReader(
      new InputStreamReader(clntSock.getInputStream())); 
    out = new PrintWriter(clntSock.getOutputStream(), true); 

    while (true) { 
     s = in.readLine(); 
     System.out.println("s : " + s); 
     if (s != null && s.length() > 0) { 
      out.print(s); 
      out.flush(); 
     } 
    } 
} 


这里就是我发送和接收数据的客户端部分(字符串):

while (true) { 
    try { 
     // Send data 
     if (chatText.getToSend().length() != 0) { 
      System.out.println("to send :" 
        + chatText.getToSend().toString()); 
      out.print(chatText.getToSend()); 
      out.flush(); 
      chatText.getToSend().setLength(0); 
     } 

     // Receive data 
     if (in.ready()) { 
      System.out.println("ready"); 
      s = in.readLine(); 
      System.out.println("s : " + s); 
      if ((s != null) && (s.length() != 0)) { 
       chatText.appendToChatBox("INCOMIN: " + s + "\n"); 
      } 
     } 

    } catch (IOException e) { 
     cleanUp(); 
    } 
} 


readline的方法阻止运行上述代码的客户端线程。我怎样才能避免这个问题?感谢您的帮助。

+0

考虑使用多线程服务器/客户端。请参阅[这里]和[this](http://www.kieser.net/linux/java_server.html)以及[http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html]这里也是](http://www.ase.md/~aursu/ClientServerThreads.html) –

+0

你正在阅读的线路,但你不写行。 – EJP

回答

0

您在客户端上使用readLine(),该客户端需要以EOL令牌结尾的行,但您的服务器端代码不会写入EOL令牌。使用println()而不是print()

为了支持并发客户端,在服务器上,您需要分拆的线程来处理接受的连接:

while (true) { 
    // Accept a connection 
    Socket socket = servSock.accept(); 

    // Spin off a thread to deal with the client connection 
    new SocketHandler(socket).start(); 
} 
0

readLine方法阻止运行上述代码的客户端线程。我怎样才能避免这个问题?

readLine是一个阻塞操作。如果你使用多个线程,这不一定是个问题。