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()
方法返回零并让我不时将请求视为空。感谢您的帮助。
我正在尝试使用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()
方法返回零并让我不时将请求视为空。感谢您的帮助。