2017-02-21 80 views
0

我一直在Java中使用围绕BufferedReader的while循环的问题。我正在用套接字做一些实验。使用BufferedReader卡在While循环中

我当前的代码:

InetAddress address = InetAddress.getByName(this.IP); 
     SocketAddress socketaddress = new InetSocketAddress(address, this.port); 
     Socket socket = new Socket(); 
     socket.connect(socketaddress); 

     if(socket.isConnected()){ 

      Executor.logger.info("Connection to proxy established!"); 

     } 
     else { 

      Executor.logger.warning("Connection to proxy failed!"); 
      socket.close(); 
      return; 

     } 

     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     String temp2; 
     while((temp2 = in.readLine()) != null){ 

      Executor.logger.info("Running query says " + temp2); 

     } 

但无论怎样我试过的代码就不会进步到下一行。它不会用任何东西给我的记录器发送垃圾邮件,它会突然停止并卡住。

这仅仅是客户端,我并不控制接收端服务器端。

我做错了什么?

感谢您提前提供任何帮助。

编辑

服务器是一个命令行接受与变量并返回,告诉你什么,你只是做的结果代码的命令。但是,当你第一次连接它时,会返回类似消息,空白行,消息,空白行这是当前被卡住的循环。

+0

它在* readLine()方块上*因为它正在等待数据。连接没有关闭,所以'readLine()'不返回'null',但没有任何数据进来,所以它一直在等待数据到达。据推测,服务器正在等待你的一些输入,直到它返回更多的数据。您还需要另一个写入线程,以便您可以同时接收数据和发送数据。 – Kayaman

+0

有没有什么办法来检测BufferedReader何时为空?我确实需要代码才能在构造函数中进行。 – Harieo

+0

您应该使用像DataFetcher这样的线程化侦听器:https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetcher.java – ControlAltDel

回答

0

经过测试,我发现了一个替代变量,可以用来检测BufferedReader是否已满。

如果从这个代码改变((TEMP2 = in.readLine())!= NULL):

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    String temp2; 
    while((temp2 = in.readLine()) != null){ 

     Executor.logger.info("Running query says " + temp2); 

    } 

,并使用布尔(in.ready())来代替:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     out.write("login " + this.user + " " + this.password); 
     out.flush(); 

     String temp2; 
     while(in.ready()){ 

      temp2 = in.readLine(); 

      Executor.logger.info("Running query says " + temp2); 

     } 

当BufferedRead没有更多数据要读取时,它将停止循环,并且可以通过再次复制循环来在需要时重新初始化。

+0

如果少于一个完整的行可用,这将仍然阻塞。 – EJP

+0

我的写入没有任何输入的测试似乎有效,代码只是跳过。该方法读取:“告诉这个流是否准备好被读取,如果缓冲区不是空的,缓冲字符流就绪...” – Harieo

+0

我建议你阅读一些网络教程,以了解如何正确执行网络IO。这不是正确的方法,即使它可能适用于特定情况。或者你可以学习错误的方式,然后在将来的某个时候遇到错误。 – Kayaman