2017-02-21 79 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