日期:2014-05-20  浏览次数:20920 次

socket心跳包
问题1:服务器要判断客户端是否保持连接,心跳包怎么实现啊,最好给点代码学习一下
问题2:读写数据超时是用setSoTimeout()吗?


------解决方案--------------------
1、在交互线程中设置一个Timer,每隔a秒向客户端发送一个简单的询问包,客户端收到后返回一个简单的答复语句则表示依然连接中。如发送后b秒未收到答复则表示客户端已经失去连接
2、参加API,setSoTimeout()需要在阻塞前调用,阻塞超过指定时间后会停止阻塞并抛出java.net.SocketTimeoutException
------解决方案--------------------
有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的。

下面一段代码就可以判断远端是否断开了连接:

try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect(); //说明断开了.
}