2015-02-10 106 views
-1

我的客戶端始終阻塞在br.readLine()。我試圖添加「\ n」,但它沒有解決問題。還有一個字符數組阻塞,當我只使用讀取而不是readLine。Java TCP套接字塊readLine

誰能幫幫我?

CLIENT

 /** Benutzereingabe einlesen **/ 
     BufferedReader brEingabe = new BufferedReader(new InputStreamReader(System.in)); 
     String send = brEingabe.readLine(); 

     Socket socket = new Socket(host, port); 

     BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     PrintWriter pr = new PrintWriter(socket.getOutputStream()); 
     pr.println(send); 
     pr.flush(); 

     System.out.println(br.readLine()); // is blocking  

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

服務器

 ServerSocket serverSocket = new ServerSocket(port); 
     while (true) { 
      //ServerSocket serverSocket = new ServerSocket(port); 
      Socket socket = serverSocket.accept(); // blockiert bis Anfrage kommt 

      BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      String zeile; 
      while ((zeile = br.readLine()) != null) { 
       System.out.println(zeile); 
       if (zeile.isEmpty()) break; 
      } 

      PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
      pw.write("Hallo\n"); 
      pw.flush(); 

      pw.close(); 
      socket.close(); 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

回答

2

你所寫的代碼做到這一點:

  • 客戶寫一個行,然後嘗試讀取之一。

  • 服務器讀取多行,直到它獲得一個空行或結束流。然後寫一行。

的問題是,服務器正在等待客戶端做的,它是不會做一些事情:

  • 客戶端將不會發送一個空行(除非它讀一個從標準輸入),

  • 客戶端將不會關閉流......直到它從服務器獲得響應。

因此客戶端正在等待服務器和服務器正在等待客戶端。僵局。


有多種方法可以解決這個問題。一個簡單的方法是改變這一點(在客戶端)

println(send); 

這個

println(send); println(); 

然而,這裏的一個問題是,你的「協議」不符合的情況下應付想要發送作爲數據的空行。這是因爲你隱式地使用了一條空行(來自客戶端)來表示「消息完成」。

+0

好吧,這解決了這個問題,但服務器如何讀取多行? – Max 2015-02-10 22:16:10

+0

查看我的更新... – 2015-02-10 22:17:14

+0

我將println(發送)更改爲pr.println(send +「\ n」);現在沒關係。 zeile.isEmpty()檢查最後是否有「\ n」?我真的不明白它是如何工作的 – Max 2015-02-10 22:27:24