ServerSocket丢失连接而没有任何错误

时间:2017-07-28 08:00:16

标签: java serversocket

我尝试使用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中看到任何错误。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

.accept()调用返回到下一次调用.accept()之前,服务器正忙。如果您的服务器在调用.accept()之间有很多工作要做(即,如果创建新线程的调用需要很长时间),那么服务器将在此期间无响应,并且如果有足够的连接到达在此期间,任何超过50日的连接都将被拒绝。

因此,要么提供更大的积压,要么(更有可能)重构您的代码,以便服务器在调用.accept()之间不会花费这么长的时间。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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