正确编码。如果 connect() 失败,请记录问题,等待退避时间,然后重试,除非真的经过了太多时间。即使服务器正在侦听,connect() 也可能由于您和我可能不知道的其他原因而失败(例如,网络 API 中的某个层有一个完整的缓冲区)。这就是为什么IOException
是受控异常,Java 编译器希望您显式处理它:IOException
s 可能会发生,但这不是编程错误。
private static final Logger LOG = Logger.getLogger(YourClass.class);
for (int waitTime = 10; waitTime < 10000; waitTime *= 2) {
try {
socket.connect();
} catch (ConnectException ex) {
LOG.log(Level.WARNING,
"Connection failed, retrying in " + waitTime + " ms...", ex);
Thread.sleep(waitTime);
} catch (IOException ex) {
throw new RuntimeException("Unexpected IO Exception", ex);
}
}
即使您使用了一些同步原语,例如屏障或信号,服务器线程也总是会在listen() 实际生效之前发出信号。因此,仍然存在错误线程交错的可能性。