2

在从 socket.accept() 捕获 IOException 并关闭执行接受的线程时不转储卡住的跟踪是很愚蠢的......解决了这个问题后,我仍然想了解如何处理这个调用时的情况巴夫斯。

我的应用程序是一个经典的套接字服务器,可以接受数百个客户端,有时甚至是数千个。接受线程始终处于启动状态并在 accept() 调用中被阻止。一旦被接受,就会启动单独的线程来做这些事情等等。没什么特别的。

问题是,accept() 失败时应该怎么办?这是否应该立即被视为永久性故障?我是否应该重新尝试进入 accept() 一段时间并尝试通过?最佳做法是什么?通常抛出 IOException 的原因是什么?

4

2 回答 2

1

我能想到的在调用中抛出 IOException 的唯一原因accept()是端口正在使用或主机的网络配置错误。

您可能会稍等片刻,然后重试,假设系统管理员会注意到问题并修复它。但是,如果在启动期间发生这种情况,最好让应用程序使用“致命”错误消息来解决问题。

于 2012-07-08T05:50:54.380 回答
1
  1. 客户端有责任重试连接失败。服务器应该只记录异常并继续执行“接受”。通常,服务器从不启动与客户端的连接。
  2. 抛出 IOException 的原因有很多,从防火墙问题到文件句柄耗尽问题。IOException 的消息应该揭示原因。
于 2012-07-08T04:55:15.640 回答