2011-06-20 32 views
2

现在我这样做:Java套接字:重试连接拒绝异常的最佳方法是什么?

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异常,如果远程主机没有在插座上听。我在单独的线程中运行我的代码,所以我不担心阻塞。鉴于此,我的方法是重试适当还是有更好的方法?

谢谢!

+2

您也可能要考虑的HttpClient(见http://hc.apache.org/httpcomponents-client-ga/tutorial/html/ fundamentals.html#d4e292)。这会为你节省很多代码。 – joeslice

回答

2

在这种情况下,我通常使用逐渐增长的每个请求的睡眠周期。

可能是因为服务器已经快到了,所以你只是想再试一次。但如果该请求失败,请等待2秒钟,但如果该请求失败,请等待4等。

可能是您想要等待30秒或一分钟或类似的数量。定义最大尝试次数可能是明智的,所以您不要无限期地等待。

像这样的东西可能会计算你的下一个延迟秒数:

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

可以尝试连接到远程服务器,但实际上很常见,但要确保在每次迭代中有一个Thread.sleep(ms),或者服务器主机可能认为您正在尝试使用DOS

1

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

相关问题