有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

serversocket JAVA无限服务器socket无原因停止

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

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

超时设置为无限:设置超时(0); 以下是服务器socket代码段:

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) 个答案

  1. # 1 楼答案

    The problem now is, after waiting for around 2 hours without any connections, the program would just stop for no reason (no exceptions).

    我觉得这简直难以置信。我认为更可能的情况是,存在一些不正确的异常处理,而不是某种JVM故障

    • 你完全确定你能在catchall中看到输出行吗
    • 你可能正在耗尽内存或其他资源吗
    • 某种操作系统防火墙会杀死休眠的服务器套接字吗

    需要意识到的一点是,当您在服务器循环中执行以下操作时,如果客户端连接并立即关闭套接字,他们可能会在那里抛出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在你的外部捕获。就错误处理而言,这是一件很糟糕的事情,但在你弄明白之前,你已经得到了豁免。:-)