2015-11-02 80 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)。我想我只能通过在每次迭代中创建一个新的套接字对象来修复它... –