【问题标题】:java.net.SocketException Connection timed out errorjava.net.SocketException 连接超时错误
【发布时间】:2010-08-04 12:24:08
【问题描述】:

当我尝试连接到 TCP 服务器时出现以下错误。我的程序尝试使用不同的线程打开大约 300-400 个连接,这发生在第 250 个线程期间。每个线程使用自己的连接来发送和接收数据。

java.net.SocketException: Connection timed out:could be due to invalid address
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:372)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:233)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:220)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:385)

这是线程用来获取套接字的代码:

socket = new Socket(my_hostName, my_port);

TCP 服务器一次可以拥有的连接数是否有任何默认限制?如果不是怎么解决这类问题?

【问题讨论】:

  • 您的服务器上处理连接的逻辑是什么?您是在使用线程池还是只是疯狂地产生线程?如果使用线程池,如果你没有关闭连接/完成请求,你可能会用完线程
  • 不,我没有使用线程池。我一次启动一个线程。每个线程都会打开一个新连接。

标签: java sockets


【解决方案1】:

如果服务器有一个 ServerSocket 绑定到您要连接的端口,但不接受连接,您可能会遇到连接超时。

如果它总是发生在第 250 个连接上,可能服务器设置为只接受 250 个连接。必须有人断开连接才能连接。或者你可以增加超时时间;不要像那样创建套接字,而是使用空构造函数创建套接字,然后使用 connect() 方法:

Socket s = new Socket(); s.connect(new InetSocketAddress(my_hostName, my_port), 90000);

默认连接超时为 30 秒;上面的代码等待 90 秒连接,如果无法建立连接则抛出异常。

您还可以设置较低的连接超时,并在捕获该异常时执行其他操作...

【讨论】:

  • 没有。您不能将连接超时时间增加到超出默认值。你只能减少它。如果低于 90 秒,上述代码将在默认时间后超时。默认连接超时因系统而异,但大约为一分钟。
【解决方案2】:

为什么所有的连接?这是一个测试程序吗?在这种情况下,请注意,从单个客户端打开大量连接会以具有大量不同客户端主机的真实系统无法执行的方式给客户端施加压力,因此来自那种客户端的测试结果并不是那么有效.您可能正在用完客户端端口或其他一些客户端资源。

如果不是测试程序,同样的问题。为什么所有的连接?您最好运行一个连接池并连续重用数量少得多的连接。毕竟网络只有这么多带宽;除以 400 不是很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多