Java套接字:重试Connection Refusedexception的最佳方法?

现在我这样做:

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)将生成ConnectionRefusedexception。 我在一个单独的线程中运行我的代码,所以我不担心阻塞。 鉴于此,我的重试方法是否适当或是否有更好的方法?

谢谢!

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

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

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

这样的事情可能会在几秒钟内计算下一个延迟:

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

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

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