2015-05-02 55 views
3

我測試了本地機器上的套接字。我試圖在一個程序中使用線程運行套接字和服務器。我的服務器是一個回顯服務器,所以它會發回它收到的任何消息。我的問題是,當我在客戶端和服務器端啓動兩個線程時,它們在到達從輸入流讀取的部分時「凍結」。它可以正常工作到客戶端發送消息的部分。之後,它只是停止,因爲看起來客戶端正在等待消息,即使我已經通過寫入輸出流向服務器發送消息,服務器也是如此。代碼有什麼問題?套接字多線程 - 讀輸入流暫停線程

Client.java

@Override 
    public void run() { 

     try { 
      Socket socket = new Socket("localhost", 22600); 

      BufferedReader br = new BufferedReader(new InputStreamReader(
        socket.getInputStream())); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        socket.getOutputStream())); 
      BufferedReader input = new BufferedReader(new InputStreamReader(
        System.in)); 
      System.out.println("Client 1"); 

      while (true) { 

       System.out.print("\nEnter text : "); 
       String inputText = input.readLine(); 
       writer.write(inputText); 
       System.out.println("Client 2"); 

       System.out.println("Client 3"); 
       String s = br.readLine(); 
       System.out.println("CLIENT RECEIVED : " + s); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

Server.java

@Override 
public void run() { 

    try { 
     ServerSocket server = new ServerSocket(22600); 
     Socket socket = server.accept(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(
       socket.getInputStream())); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
       socket.getOutputStream())); 


     System.out.println("Server 1"); 
     while (true) { 

      System.out.println("Server 2"); 
      String s = br.readLine(); 
      System.out.println("Server 3"); 
      if (s == null) { 
       System.out.println("NULL SERVER SIDE ERROR"); 
       break; 
      } 

      writer.write("ECHO : " + s); 
      System.out.println("SYSOUT ECHO " + s); 

     } 
     server.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

回答

5

你正在編寫一個沒有在其末端的末端的行的字符串。

  String inputText = input.readLine(); 
      writer.write(inputText); 
      System.out.println("Client 2"); 

inputText字符串不包含您鍵入的行尾。你把它原樣寫到服務器上。但是,服務器嘗試讀取一行:

 String s = br.readLine(); 
     System.out.println("Server 3"); 

因此它會一直等待,直到客戶端發送換行符。但到現在爲止,客戶端正在等待服務器的迴應,現在它們已經陷入僵局。

所以,你應該添加一個writer.newLine()到客戶端,以及服務器的回聲,它遭受同樣的問題。在每次寫入之後,還建議在服務器和客戶端上使用writer.flush()。否則,它可能會在實際寫入之前等到緩衝區已滿,並且會導致相同的死鎖。

+0

它現在。非常感謝!我從來沒有想過這個問題只是由於缺少換行符而造成的。 – JavaFanatic

3

BufferedReaderreadLine方法需要一個新的行結束返回一個值(除非達到流的末尾),然後返回線而不這個字符。所以客戶端

  1. 讀取來自用戶的行成可變inputText
  2. 客戶端寫入inputText
  3. 服務器接收數據的OutputStream,但等待,直到它接收到一個新的行(事實並非如此)。

如果您希望使用新行作爲分隔符的通信,把這段數據端發送

writer.write(inputText + "\n");