【问题标题】:JAVA infinite server socket stopped for no reasonJAVA无限服务器socket无故停止
【发布时间】:2012-03-29 19:18:48
【问题描述】:

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

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

我真的很困惑,任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 尝试捕捉 Throwable。也许一些 JVM 错误没有消息就出来了。

标签: java serversocket


【解决方案1】:

现在的问题是,在没有任何连接的情况下等待大约 2 小时后,程序会无缘无故停止(没有例外)。

我觉得这非常难以置信。我认为更有可能是一些不适当的异常处理而不是某种 JVM 故障。

  • 您确定会在您的catch all 中看到输出行吗?
  • 内存或其他资源是否不足?
  • 某种操作系统防火墙会杀死休眠的服务器套接字吗?

需要意识到的是,当您在服务器循环中执行以下操作时,如果客户端连接并立即关闭套接字,它们可能会在那里抛出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));

然后在socketTrun()方法中启动你的IO。

要尝试的另一件事是不要使用 0 超时执行 server.accept(),而是将其设置为一分钟或其他时间 (60000) 并捕获 SocketTimeoutException 然后循环。从长远来看,这不是正确的做法,但它可能会转移问题并更好地暴露问题。

最后,你在你的外部捕捉中捕捉Throwable。在错误处理方面,这是一件很糟糕的事情,但在你弄清楚之前,你已经得到了豁免。 :-)

【讨论】:

  • 谢谢,这是一个消耗内存的服务器,所以当它闲置一段时间后,linux会杀死它...
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多