java.net.SocketException连接超时错误

时间:2010-08-03 19:11:22

标签: java sockets

当我尝试连接到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服务器一次可以拥有的连接数是否有默认限制?如果不是如何解决这类问题?

2 个答案:

答案 0 :(得分:5)

如果服务器的ServerSocket绑定到您要连接的端口但是不接受连接,则可能会出现连接超时。

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

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

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

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

答案 1 :(得分:0)

为什么所有连接?这是一个测试程序吗?在这种情况下,请注意从单个客户端打开大量连接会以不具有大量不同客户端主机的实际系统的方式强调客户端,因此来自该类客户端的测试结果并非完全有效。 。您可能正在耗尽客户端端口或其他一些客户端资源。

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