日期:2014-05-18  浏览次数:21283 次

Socket 网络断开
在维护一个网络通信程序,用是的阻塞模式。
当客户连上服务器后,把客户的网络断开(物理断网),客户一直显示连接上服务器,服务器也一直显示客户端在线。
这是因为客户连上后一直在等待服务器端发过来数据receive阻塞了,有没有办法就是让他receive来不接收数据了呢?
就是在一段时间后没收到数据就报一个异常?

我想通过另一个线程来检测如果上一次接收数据与现在超过1分钟就将Socket关闭,但是receive还是没有退出或抛出异常。因为现在所的功能都用一个socket,没法改成异步模式。

有其余解决办法?

------解决方案--------------------
发送心跳包来检测
------解决方案--------------------
你理解的socket模型不够正确
socket设计的基础是假定不知道当前状态,事实上也不可能立即(immediately)随时知道是否连接
所以设计者考虑在read/write时抛出异常来反映给client,除非主动断开连接会有握手
那你要根据这个概念去写,
就是在write时catch断开的异常,其次如果需要知道大概的连接状态,则是定时由client向server发送心跳包来维护当前状态。

May it helps.
------解决方案--------------------
用另一个线程定时向服务器发送数据,如果物理断开就会出现异常,
------解决方案--------------------
只有在Read/Receive时才会触发检查物理链路,否则无视物理链路
所以通过发送心跳包定时检测物理链路的连通性