【问题标题】:ServerSocket loses connections without any errorsServerSocket 失去连接而没有任何错误
【发布时间】:2017-07-28 08:00:15
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 完成后是否关闭套接字?
  • 是的,套接字正在关闭,也没有任何错误

标签: java serversocket


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嗯。我认为这不是个案。首先,除了在accept() 之间开始的新线程之外,什么都没有。第二 - 连接数比 50 少得多。大约 10 个。或者 Chrome 可能会做一些额外的请求?无论如何,我会尽量增加积压。
  • 不,没有帮助:(
  • 好的,值得一试。希望有人提出更好的主意。
【解决方案2】:

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

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

【讨论】:

  • 但我总是尝试读写一些东西。而且我没有收到任何错误。
  • 网络有故障。您不能编写建立套接字的代码并确保套接字始终工作。所以在代码中需要处理掉连接丢失的可能性。
  • 嗯。也许我不明白什么,但是,正如我所说,我没有得到任何错误。那么如何处理丢失的连接呢?
  • 您在服务器端没有错误,因为您没有尝试在服务器端读取或写入。设想。您建立连接,没有数据发送。连接丢失。客户端尝试发送一些东西。客户端收到错误。服务器没有收到错误。
  • 您是否在客户端出现错误的连接上进行读写?或者你在其他连接上读写?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多