我正在使用以下代码片段发出一个套接字连接
Socket socket = new Socket();
InetSocketAddress endPoint = new InetSocketAddress("localhost", 1234);
try
{
socket.connect(endPoint, 30000);
}
catch (IOException e)
{
e.printStackTrace();
// Logging
}它尝试连接的端点处于脱机状态,我想让它做的是尝试连接,然后使用30000ms超时时间等待一段时间,然后得出结果
目前,似乎没有应用30000参数,因为从我的日志记录的时间戳来看,它似乎在1秒内确定连接失败。
如何强制连接在放弃之前等待一段时间?
13:13:57,685 6235 DEBUG [Thread-7] - Unable to connect to [localhost:1234]
13:13:58,685 7235 DEBUG [Thread-7] - Unable to connect to [localhost:1234]
13:13:59,695 8245 DEBUG [Thread-7] - Unable to connect to [localhost:1234]
13:14:00,695 9245 DEBUG [Thread-7] - Unable to connect to [localhost:1234]编辑:API确实声明了Connects this socket to the server with a specified timeout value. A timeout of zero is interpreted as an infinite timeout. The connection will then block until established or an error occurs.,但我似乎没有遇到这样的行为,或者没有迎合它,很可能是后者
发布于 2010-11-04 21:28:25
你在这里得到的是正确的。connect不会坐在套接字上等待,直到它看到服务器,它会尝试连接并等待响应。如果没有要连接的内容,则返回。如果有要连接的东西,它将等待响应的超时秒数,如果没有收到响应,则会失败。
发布于 2010-11-05 17:37:41
您需要区分几种可能的异常情况。
连接被拒绝,这表示主机已启动且可访问,但端口上没有任何侦听。这种情况发生得非常快,并且不能受到timeout.
NoRouteToHostException:的影响,这表明存在连接问题。同样,它是立即发生的,并且不能受到timeout.
UnknownHostException:的影响,主机名不能通过DNS进行解析。这会立即发生,或者更确切地说,是在一般较短的DNS延迟之后发生的,并且不会受到带有任何其他文本的timeout.
ConnectException的影响:这可能表示目标系统无法响应。通常在存在防火墙时发生。可能会超时。使用超时参数调用Socket.connect()是正确的做法。如果您不这样做,或者如果您指定了零超时,则使用默认的系统超时,根据平台的不同,该超时大约为60-75秒。这与Javadoc关于“无限超时”的说法相反,这是不正确的。此外,您不能通过带timeout参数的Socket.connect()将超时时间增加到超过此限制。或者,您可以通过select()在非阻塞模式下使用java.nio套接字通道来管理超时,但您仍然不能通过此方法或任何其他方法将超时增加到平台默认值之外。
发布于 2010-11-04 21:27:53
当超时发生时,会抛出一个您不会捕获和记录的SocketTimeoutException异常。当“连接过程中发生错误”时,将触发IOException。永远不会应用超时,因为预先存在错误。
编辑:只是为了澄清: TCP/IP作为一套协议有许多细节,可能会阻止数据包达到其期望的结果( SYN/ACK数据包)。如果计算机对您的SYN数据包的响应是通知您的应用程序该端口已关闭(即没有应用程序在那里运行/侦听),它将触发一个异常,告诉您无法连接到该端口。如果您希望以任何一种方式发送和重新发送SYN数据包,并且知道某个应用程序将在该端口上进行在线侦听,那么这是在不同的网络层上完成的(据我所知,使用Java开箱即用是不可访问的)。
https://stackoverflow.com/questions/4097068
复制相似问题