2012-06-30 135 views
4

我想發送一個命令到服務器,並找出我是否得到迴應。如何在不阻塞的情況下從Java中的BufferedReader中讀取數據?

現在我正在使用BufferedReaderreadline()函數,它會阻塞,直到有服務器的響應,但我想要做的就是驗證服務器首先有響應。

我嘗試使用ready()reset()來避免這個阻止,但它沒有幫助。

這導致我的程序卡住等待服務器響應,這從來沒有發生過。通過我對事物的理解,InputStreamReader似乎也做了同樣的事情。

其他問題我在這裏找到關於這個問題沒有回答我的問題, 所以請如果你能回答我的問題,它會很好。

+0

有趣的是,如果服務器做了flush()並確保發送了一個換行符('println')。 –

+0

阻止直到有迴應並找出是否有迴應,有什麼區別?無論如何,您必須在服務器上等待。 – EJP

回答

1

可能是你所需要的是InputStream沒有在BufferedReader

while (inputStream.available() > 0) { 
    int i = inputStream.read(tmp, 0, 1024); 
    if (i < 0) 
      break; 
    strBuff.append(new String(tmp, 0, i)); 
} 

我希望這有助於其包裝。

+0

此技術不需要更改爲InputStream。 – EJP

+0

這對於消除阻塞行爲沒有任何作用 –

+0

@EJP如果沒有輸入,它能否讓他停止等待?在他的問題中他說:「但我想要做的就是首先確認服務器有迴應。」 –

3

如果你想異步讀取響應,我建議啓動一個讀取BufferedReader的線程。這是更簡單的代碼和更容易控制。

+1

我認爲BufferedReader是無障礙讀取數據的最佳實踐。但對於某些設備,「readLine」甚至「準備好」阻止(「準備就緒」永遠不會阻止):http://stackoverflow.com/questions/27427213/bufferedreader-ready-blocking –

0

我最近使用CountDownLatch做了類似的事情。可能有一些更好的方法,但這很容易,而且似乎工作得很好。您可以調整CountDownLatch的等待以滿足您的需求。

package com.whatever; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.concurrent.CountDownLatch; 
import java.util.concurrent.TimeUnit; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class TestRead { 
    private static final Logger log = LoggerFactory.getLogger(TestRead.class); 
    private CountDownLatch latch = new CountDownLatch(1); 

    public void read() { 
     URLReader urlReader = new URLReader(); 
     Thread listener = new Thread(urlReader); 
     listener.setDaemon(true); 
     listener.start(); 
     boolean success = false; 
     try { 
      success = latch.await(20000, TimeUnit.MILLISECONDS); 
     } catch (InterruptedException e) { 
      log.error("error", e); 
     } 
     log.info("success: {}", success); 
    } 

    class URLReader implements Runnable { 
     public void run() { 
      log.info("run..."); 
      try { 
       URL oracle = new URL("http://www.oracle.com/"); 
       URLConnection yc = oracle.openConnection(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); 
       String inputLine; 
       while ((inputLine = in.readLine()) != null) 
        System.out.println(inputLine); 
       in.close(); 
       latch.countDown(); 
      } catch (Exception ex) { 
       log.error("error", ex); 
      } 
      log.info("consumer is done"); 
     } 

    } 
    public static void main(String[] args) { 
     TestRead testRead = new TestRead(); 
     testRead.read(); 
    } 
} 
相關問題