2

我正在尝试手动处理套接字到服务器的连接超时。如果服务器在 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

这是一个错误,还是我做错了什么?

4

0 回答 0