我看到刚刚发布的另一个答案,但我认为您与玩游戏的客户互动,所以我可能会提出另一种方法(而 BufferedReader 在某些情况下绝对有效)。
如果您想...您可以将“注册”责任委托给客户。即,您将拥有一组已连接用户,并在从每个用户收到的最后一条消息上带有时间戳……如果客户端超时,您将强制重新注册客户端,但这会导致下面的引用和想法。
我已经读过,要实际确定套接字是否已关闭,必须将数据写入输出流并且必须捕获异常。这似乎是处理这种情况的一种非常不干净的方式。
如果您的 Java 代码没有关闭/断开 Socket,那么如何通知您远程主机关闭了您的连接?最终,您的 try/catch 所做的事情与在 ACTUAL 套接字上侦听事件的轮询器所做的事情大致相同。考虑以下:
- 您的本地系统可以在不通知您的情况下关闭您的套接字......这只是 Socket 的实现(即它不会轮询硬件/驱动程序/固件/任何状态更改)。
- 新的 Socket(Proxy p)... 多方(实际上是 6 个端点)可能正在关闭您的连接...
我认为抽象语言的特点之一是你从细节中抽象出来。想想 C# 中的 using 关键字(try/finally)用于 SqlConnection 或其他什么......这只是做生意的成本......我认为 try/catch/finally 是 Socket 使用的公认和必要模式。