我正在尝试手动处理套接字到服务器的连接超时。如果服务器在 1 秒内没有回复,我想知道,然后再尝试 3 次。
以下是我的代码所基于的主要行:
// tcpSocket was previously declared, instantiate it
tcpSocket = new Socket();
try {
// try to connect with a 1-second timeout
tcpSocket.connect(new InetSocketAddress(mRemoteAddr, mRemotePort), 1000);
} catch (SocketTimeoutException ex) {
// retry here... omissis
}
当第一个连接(例如,来自本地端口X
)在 1000 毫秒内未被接受时,我确实得到了SocketTimeoutException
并且以下连接成功(例如,在新的本地端口上Y
)。
但是当使用 Wireshark 读取 TCP 包时,我可以看到,在 3-6-9-etc 秒后,X
连接会自动重试,因为发送了一个新SYN
包!我什至尝试将 atcpSocket.close()
放在 的catch
块中SocketTimeoutException
,但是如果未建立连接,则无法关闭它(调用close
不会导致任何结果)。
据我了解,当且仅当我没有在方法中指定任何超时时,我看到的错误行为(即连接的自动重试)才是正确的connect
。
这是一个错误,还是我做错了什么?