2015-11-02 91 views
0

我正在構建一個Web服務器和客戶端,我將在Raspberry Pi上使用它。服務器是用Python編寫的,每當客戶端連接到它時,服務器都會將數據返回給客戶端。這很好,當我通過瀏覽器訪問服務器時,我看到了正確的數據,當我刷新頁面時,我得到了新數據,因此工作正常。從服務器收集迭代數據

問題是我正在用Java編寫一個客戶端來訪問服務器並收集數據。我在這裏使用Java的原因是我對它更有經驗,我發現構建GUI更方便;我在樹莓派上使用python,因爲它爲我提供了一種與硬件交互的簡單方法。 Java客戶端的代碼,我是這樣的:

while (true) { 
    Socket socket = new Socket("192.168.0.37", 9315); 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    try { 
     System.out.println("Getting"); 
     out.write("GIMME DATA!"); 
     out.flush(); 
     System.out.println("receiving"); 
     String data; 
     while ((data = in.readLine()) != null) { 
      System.out.println("Line: " + data); 
     } 
     socket.close(); 
     Thread.sleep(5000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

這一切運作良好,但我想借此最初3名對象進行while循環的(很顯然沒有關閉連接)。當我這樣做時,我只能訪問服務器一次(它會給我正確的數據),第二次運行in.readling()將返回null,這很奇怪。看起來inputstream只有初始運行的數據,並且沒有更多的字節被寫入。要清楚的是,將最初的3個對象放在while循環中時,一切運行良好。

如何將對象從循環中取出?它似乎浪費,耗時,並可能消耗內存消耗,每次創建它們...

+0

我只是看着這個,因爲它有一個python標籤; Java並不是我最喜歡的混合,但是我猜想'in'會在第一次迭代中達到eof,並且會使第二次和後續調用中的readLine調用無條件地返回null .. –

回答

-1

一旦你到達文件結束或BufferedReader到達數據結束,那麼它如何從頭再次打印數據。例如:

 int i = 0; 
    BufferedReader br = new BufferedReader(new FileReader(new File("C:\\data.txt"))); 
    while (true) { 

     String data = ""; 
     while ((data = br.readLine()) != null) { 
      System.out.println(" data :" + data); 
     } 

     Thread.sleep(1000); 
     i++; 
     if (i == 2) { 
      break; 
     } 
    } 
    br.close(); 

在上面的程序中,br到達文件結尾,那麼它不能指向開頭。每次輸入while循環時都必須創建BufferedReder對象。

+0

我在代碼中通過初始化在while循環之前的socket和out對象以及while循環中的緩衝讀取,但這仍然不起作用。它只在第一次迭代中檢索數據,在後續迭代中它不檢索數據:in.readLine()返回null –

+0

必須在while循環的第一行中創建BufferedReader的對象,並在最後一行中關閉它退出循環。 –

+0

然後它給我一個錯誤,告訴我套接字已經關閉了(儘管我只關閉了bufferedreader)。我想我只能通過在每次迭代中創建一個新的套接字對象來修復它... –