我正在构建一个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();
}
}
这一切都运行良好,但我想从while循环中取出最初的3个对象(显然不会关闭连接)。当我这样做时,我只能访问服务器一次(它会给我正确的数据),在第二次运行时in.readling()
将返回null,这很奇怪。似乎输入流只有初始运行的数据,并且没有更多的字节写入它。要清楚的是,当将最初的3个对象放入while循环时,一切都运行良好。
如何将对象取出循环?每次创建它们似乎都是浪费,耗时并且可能耗费内存......
答案 0 :(得分:-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对象。