在serverclient中重用socket的java
我正在尝试创建一个客户机-服务器系统:我的服务器是一个raspberry pi,在它上面运行一个python Web服务器,我的客户机在另一台pc上,是用Java编写的。其思想是,服务器收集数据,当它收到客户机的请求时,它将数据发送到客户机。 我的客户应该请求数据,等待10秒,然后再次请求,等等
目前,该系统正在工作,但大约一天后,客户端开始出现大量(但不是持续)socket超时。我认为可能是这样的,因为对于每个请求,我都会创建一个新的用于通信的socket,我认为一天之后,socket就会用完或者类似的事情。这是客户端每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;
}
我试图通过使用一个作为封装类成员的socket来修复它,但是在一个请求之后,inputstream停止工作。有没有什么方法可以让我继续使用单个socket与服务器进行所有通信?或者这是推荐的进行此类沟通的方式
# 1 楼答案
如果可能的话,尝试使套接字对象保持静态,这只会创建一次,并且每10秒读取一次数据 否则,您可以在调用getData方法之前实例化它,然后读取它。 这样做只会生成套接字的一个副本
我不认为你的港口已经用完了。 原因可能很简单,您的程序在超时之前没有收到数据。这是坏网络中的正常情况
如果超时不是以编程方式设置的,套接字通常会无限期地等待,直到收到数据
# 2 楼答案
尝试先关闭套接字和输入、输出流。正如在你的代码中一样,没有保证你会释放所获取的对象