我尝试使用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中看到任何错误。
我做错了什么?
答案 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()
方法返回零并且让我不时地将请求视为空。谢谢你的帮助。