ServerSocket 毫无错误地失去连接

ServerSocket loses connections without any errors

我正在尝试使用SocketServer生成网页、JS脚本和其他东西。看起来像这样:

ServerSocket serverSocket = new ServerSocket(port);
while (!stop) {
    Socket socket = serverSocket.accept();
    new Thread() { @Override ...
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        // And here we reading requests and writing responses
    } }.start();
}

而且大多数时候它都有效。 Chrome 成功从该服务器接收页面。

但是!今天我注意到,如果有人足够快地发出大量请求 - 服务器开始拒绝连接。所以 Chrome 给了我这个:

net::ERR_SOCKET_NOT_CONNECTED

在服务器端,我在 try-catch 中看不到任何错误。

我做错了什么?

如果由于任何原因,客户端和服务器之间的网络连接丢失,只有当您尝试在套接字中读取或写入内容时,您才会收到通知。

您需要添加代码来处理此类错误并尝试重新建立新连接。

这很奇怪,因为您必须发出 waaay toooo maaany 请求才会失败。也许您没有向我们展示您的所有代码?

无论如何,这是可能发生的事情:

您在内部使用的 ServerSocket( int port ) 构造函数委托给 new ServerSocket( int port, int backlog, InetAddress bindAddr ) 构造函数,将值 50 传递给 backlog。这是服务器繁忙时可以挂起的连接数。

.accept() 调用 returns 到下一次 .accept() 调用,服务器一直处于忙碌状态。如果您的服务器在调用 .accept() 之间有很多工作要做(即,如果创建新线程的调用需要很长时间),那么在这段时间内服务器将没有响应,如果有足够的连接到达在此期间,任何超过 50 次的连接都将被拒绝。

因此,要么提供更大的积压工作,要么(更有可能)重组您的代码,以便服务器在调用 .accept().

之间不会花费这么长时间

问题是关于 InputStream.available() 方法返回零并让我不时将请求视为空。感谢您的帮助。