我使用无限循环编写了一个多线程服务器套接字来接受客户端连接。 每个客户端连接都由一个线程处理。
现在的问题是,在没有任何连接的情况下等待大约2个小时之后,程序将无缘无故地停止(没有例外)。
超时设置为无限:setSoTimeout(0); 这是服务器套接字代码段:
try {
while(true) {
socket = server.accept();
BufferedReader ois = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter oos = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
SocketHandler socketH = new SocketHandler(socket, ois, oos, this);
Thread socketT = new Thread(socketH);
socketT.start();
}
} catch (Exception e) {
Debugger.log(e.getClass().toString() + ": " + e.getMessage());
}
我真的很困惑,任何帮助都会非常感激,谢谢!
答案 0 :(得分:0)
现在的问题是,在等待大约2个小时没有任何连接后,程序将无缘无故地停止(没有例外)。
我觉得非常很难相信。我认为有可能存在一些不正确的异常处理而不是某种JVM错误。
catch
所有内容中都看到了输出行?要实现的一件事是,当您在服务器循环中执行以下操作时,如果客户端连接并立即关闭套接字,它们可能会抛出IOException
。
BufferedReader ois = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedWriter oos = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
我建议在客户端线程中执行所有。只需将socket
传入您的SocketHandler
构造函数:
Thread socketT = new Thread(new SocketHandler(socket));
然后使用run()
的{{1}}方法启动您的IO。
要尝试的另一件事是不要使用0超时执行socketT
,而是将其设置为一分钟或某事(server.accept()
)并捕获60000
然后循环。这不是长期做正确的事情,但它可能会解决问题并更好地揭露问题。
最后,你在外面抓住了SocketTimeoutException
。在错误处理方面,这是一件很重要的事情,但在你明白这一点之前,你已经有了一个特权。 : - )