我正在尝试创建一个客户机-服务器系统:我的服务器是一个raspberry pi,它在上面运行一个python网络服务器,而我的客户机在另一台pc上,并且是用Java编写的。其思想是服务器收集数据,当它收到来自客户端的请求时,它将数据发送到客户端。我的客户应该请求数据,等待10秒,然后再次请求,依此类推。
我认为情况可能是这样的,因为对于每个请求,我创建了一个新的套接字用于通信,我认为在一天后套接字会用完或类似的东西。这是客户端每10秒执行一次的代码:
public static String getData() throws Exception {
TreeSet<Integer> primes = MathUtils.primesSieve(10000);
try {
String data = "";
Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
socket.setReuseAddress(true);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int msg = ColUtils.drawRandomlyWithReplacement(primes, 1, ArrayList::new).get(0);
out.write(msg+"");
out.flush();
String input;
while ((input = in.readLine()) != null) {
data += input;
if (!data.endsWith("#" + prod(msg))) {
throw new Exception("WRONG ECHO");
}
}
socket.close();
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}我尝试通过使用封装类的成员套接字来修复它,但在单个请求之后,输入流停止工作。有没有什么方法可以让我继续使用单个套接字来处理与服务器的所有通信?或者这是进行这种通信的推荐方式吗?
发布于 2015-12-08 23:51:54
首先尝试关闭套接字和输入、输出流。正如在您的代码中一样,没有保证您正在释放所获取的对象。
PrintWriter out = null;
BufferedReader in = null;
Socket socket = null;
try {
...//your statements
} catch (Exception ex) {
//catch or whatever
} finally {
if (out != null) out.close();
if (in != null) in.close();
if (socket != null) socket.close();
}发布于 2015-12-08 23:49:33
如果可能,尽量使Socket对象成为静态对象,该对象将只创建一次,并每10秒读取一次数据,否则您可以在调用getData方法之前实例化它,然后再读取它。这样做只会创建一个套接字副本。
我不认为你的港口快用完了。原因可能很简单,你的程序在超时之前没有接收到数据。这在一个糟糕的网络中是很正常的
如果超时不是以编程方式设置的,套接字通常会无限期地等待,直到接收到数据
https://stackoverflow.com/questions/34159878
复制相似问题