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