现在我正在这样做:
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
异常。我在一个单独的线程中运行我的代码,所以我不担心阻塞。鉴于此,我的重试方法是否合适还是有更好的方法???
谢谢!
答案 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
调用(因此只有在您确实需要等待时才会执行),以便在您再次尝试之前等待几秒钟。