【发布时间】:2015-12-08 15:35:55
【问题描述】:
我正在尝试创建一个客户端-服务器系统:我的服务器是一个树莓派,它在上面运行一个 python 网络服务器,而我的客户端在另一台电脑上并且是用 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;
}
我尝试通过拥有一个作为封装类成员的套接字来修复它,但是在单个请求之后,输入流停止工作。有什么方法可以让我继续使用单个套接字与服务器进行所有通信?或者这是进行这种交流的推荐方式?
【问题讨论】:
-
当你
close()套接字时,它的所有资源都将被释放,所以你不能在那里“用尽套接字”。只要确保你close()套接字在任何情况下,即使发生异常:try { ... } finally { socket.close(); } -
服务器/Python 端会不会有问题?
-
感谢您的建议,我会尝试并回复您。我认为服务器端没有问题:当我得到所有超时时,只需重新启动客户端即可解决问题。
-
顺便说一句,
setReuseAddress()是 meaningful for ServerSockets only。 -
@HannoBinder 这在这段代码中肯定没有意义,因为
Socket已经在构造中绑定和连接了。