Java 强制socket.connect等待一段特定时间,然后再确定连接不可用
我正在使用以下代码段发出套接字连接Java 强制socket.connect等待一段特定时间,然后再确定连接不可用,java,sockets,Java,Sockets,我正在使用以下代码段发出套接字连接 Socket socket = new Socket(); InetSocketAddress endPoint = new InetSocketAddress("localhost", 1234); try { socket.connect(endPoint, 30000); } catch (IOException e)
Socket socket = new Socket();
InetSocketAddress endPoint = new InetSocketAddress("localhost", 1234);
try
{
socket.connect(endPoint, 30000);
}
catch (IOException e)
{
e.printStackTrace();
// Logging
}
它尝试连接的端点处于脱机状态,我希望它尝试连接,并使用30000
ms超时,等待该时间段,然后得出结果
目前,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]
编辑:does状态
使用指定的超时值将此套接字连接到服务器。零超时被解释为无限超时。然后,连接将被阻止,直到建立或出现错误。
但是,我似乎没有遇到这种行为,或者没有满足它,很可能是后者。在连接之前尝试scocket.setSoTimeout(超时)。在连接之前尝试scocket.setSoTimeout(超时)。当超时发生时,将引发SocketTimeoutException异常,您不会捕获并记录该异常。IOException在“连接过程中发生错误”时触发。由于事先存在错误,因此从不应用超时
编辑:只是澄清一下:TCP/IP作为一个套件有许多细节,可能会阻止数据包达到预期的结果(SYN/ACK数据包)。如果计算机响应您的SYN数据包,通知您的应用程序端口已关闭(即没有应用程序在那里运行/侦听),它将触发异常,告诉您无法连接到该端口。如果您知道某个应用程序将在线侦听该端口,并且希望以任何一种方式发送和重新发送SYN数据包,则这是在另一个网络层上完成的(据我所知,Java开箱即用是无法访问的)。当超时发生时,将引发SocketTimeoutException异常,您不会捕获并记录该异常。IOException在“连接过程中发生错误”时触发。由于事先存在错误,因此从不应用超时
编辑:只是澄清一下:TCP/IP作为一个套件有许多细节,可能会阻止数据包达到预期的结果(SYN/ACK数据包)。如果计算机响应您的SYN数据包,通知您的应用程序端口已关闭(即没有应用程序在那里运行/侦听),它将触发异常,告诉您无法连接到该端口。如果您知道某个应用程序将在该端口上侦听而希望以任何一种方式发送和重新发送SYN数据包,那么这是在另一个网络层上完成的(据我所知,用现成的Java是无法访问的)。您在这里得到的是正确的。connect不会坐在套接字上等待,直到它看到服务器,它将尝试连接并等待响应。如果没有要连接的内容,则返回。如果有东西要连接,它将等待超时秒以获得响应,如果没有收到响应,它将失败。这里的内容是正确的。connect不会坐在套接字上等待,直到它看到服务器,它将尝试连接并等待响应。如果没有要连接的内容,则返回。如果有东西要连接,它将等待响应超时秒,如果没有收到响应,它将失败。您需要区分几种可能的异常情况
ConnectException
带有文本“连接被拒绝”,这意味着主机已启动且可访问,端口上没有任何内容正在侦听。这种情况发生得很快,不能超时NoRouteToHostException
:这表示存在连接问题。同样,它会立即发生,并且不能超时UnknownHostException
:无法通过DNS解析主机名。这会立即发生,或者更确切地说是在通常较短的DNS延迟之后发生,并且不会受到超时的影响ConnectException
和任何其他文本:这可能表示目标系统未能响应。通常在存在防火墙时发生。可能会受到超时的影响通过调用带有超时参数的
Socket.connect()
,您正在做正确的事情。如果不执行此操作,或者指定零超时,则使用默认系统超时,根据平台的不同,系统超时大约为60-75秒。这与Javadoc关于“无限超时”的陈述相反,这是不正确的。此外,您不能通过带有超时参数的Socket.connect()
将超时增加到该限制之外。或者,您可以在非阻塞模式下使用java.nio
套接字通道和select()
为您管理超时,但您仍然无法通过此方法或任何其他方法将超时增加到平台默认值之外。您需要区分几种可能的异常情况
ConnectException
带有文本“连接被拒绝”,这意味着主机已启动且可访问,端口上没有任何内容正在侦听。这种情况发生得很快,不能超时NoRouteToHostException
:这表示存在连接问题。同样,它会立即发生,并且不能超时UnknownHostException
:无法通过DNS解析主机名。这会立即发生,或者更确切地说是在通常较短的DNS延迟之后发生,并且不会受到超时的影响ConnectException
和任何其他文本:这可能表示目标系统未能响应。通常在存在防火墙时发生。可能会受到超时的影响