Dan*_*wer 82 java sockets networking client-server
我遇到了Java套接字API的一些问题.我正在尝试显示当前连接到我的游戏的玩家数量.很容易确定玩家何时连接.但是,确定玩家何时使用套接字API断开连接似乎不必要.
调用isConnected()已远程断开的套接字似乎总是返回true.同样,调用isClosed()已远程关闭的套接字似乎总是返回false.我已经读过,要实际确定套接字是否已关闭,必须将数据写入输出流并且必须捕获异常.这似乎是处理这种情况的一种非常不洁净的方式.我们不得不经常通过网络垃圾邮件垃圾邮件,以便知道套接字何时关闭.
还有其他解决方案吗?
use*_*421 163
没有TCP API可以告诉您当前的连接状态.isConnected()并isClosed()告诉你套接字的当前状态.不一样的事情.
isConnected()告诉你,无论你已连接此套接字.你有,所以它返回true.
isClosed()告诉你,无论你已关闭此套接字.在你拥有之前,它会返回false.
如果对等方以有序的方式关闭了连接
read() 返回-1readLine() 回报 nullreadXXX()投掷EOFException任何其他XXX.
写入会抛出IOException:'由peer重置连接',最终会受到缓冲延迟的影响.
如果连接由于任何其他原因而掉线,则写入将IOException最终抛出,如上所述,并且读取可能会执行相同的操作.
如果对等体仍然连接但未使用连接,则可以使用读取超时.
与你在其他地方读到的内容相反,ClosedChannelException并没有告诉你这一点.[也不对SocketException: socket closed.]它只是告诉你,你关闭了通道,然后继续使用它.换句话说,您的编程错误.它不表示已关闭的连接.
在Windows XP上使用Java 7进行的一些实验结果表明,如果:
OP_READselect() 返回大于零的值SelectionKey已经无效(key.isValid() == false)这意味着对等体已重置连接.然而,这可能是JRE版本或平台所特有的.
在各种消息传递协议中通常的做法是保持彼此的心跳(继续发送ping数据包),数据包不需要非常大.探测机制将允许您检测断开连接的客户端,甚至在TCP一般计算出来之前(TCP超时远高)发送探测并等待5秒钟回复,如果您没有看到回复说2-3后续探测,您的播放器已断开连接.
还有,相关问题
| 归档时间: | 
 | 
| 查看次数: | 92303 次 | 
| 最近记录: |