2015-02-10 139 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