Java套接字:重试Connection Refused异常的最佳方法?

时间:2011-06-20 18:16:59

标签: java sockets exception-handling

现在我正在这样做:

while (true) {
    try {
        SocketAddress sockaddr = new InetSocketAddress(ivDestIP, ivDestPort);
        downloadSock = new Socket();
        downloadSock.connect(sockaddr);
        this.oos = new ObjectOutputStream(downloadSock.getOutputStream());
        this.ois = new ObjectInputStream(downloadSock.getInputStream());
        break;
    } catch (Exception e) {}
}
如果远程主机没有在套接字上侦听,

downloadSock.connect(sockaddr)将生成ConnectionRefused异常。我在一个单独的线程中运行我的代码,所以我不担心阻塞。鉴于此,我的重试方法是否合适还是有更好的方法???

谢谢!

3 个答案:

答案 0 :(得分:4)

可以尝试尝试在循环中连接到远程服务器,并且实际上非常常见,但确保每次迭代中都有Thread.sleep(ms),或者,服务器主机可能认为您是尝试DOS

答案 1 :(得分:2)

在这种情况下,我通常会在每次请求时使用逐渐延长的睡眠时间。

可能是服务器差不多了,所以你只想在一秒钟后再试一次。但是如果该请求失败,请等待2秒,但如果该请求失败,请等待4等等。

您可能希望限制等待30秒或一分钟或类似的事情。定义最大尝试次数可能是明智的,因此您不能无限期地等待。

这样的事情可能会以秒为单位计算下一个延迟:

seconds_to_wait = Math.min(60, Math.pow(2, try_num));

答案 2 :(得分:1)

您的方法将一个接一个地连接请求服务器。您应该在Thread.sleep()块中包含catch调用(因此只有在您确实需要等待时才会执行),以便在您再次尝试之前等待几秒钟。

相关问题