JAVA无限服务器套接字无缘无故停止

时间:2012-03-29 19:18:49

标签: java serversocket

我使用无限循环编写了一个多线程服务器套接字来接受客户端连接。 每个客户端连接都由一个线程处理。

现在的问题是,在没有任何连接的情况下等待大约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());
    }

我真的很困惑,任何帮助都会非常感激,谢谢!

1 个答案:

答案 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。在错误处理方面,这是一件很重要的事情,但在你明白这一点之前,你已经有了一个特权。 : - )