Socket判断网络断开

能大家知道在使用Java Socket编程的时候经常要检测网络是不是完好连接的。比如Socket服务器检测和客户端的连接是否已经断开。
首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
使用Socket的isconnected()方法检测时,滞后是很大的,往往在20秒以上。这不利于系统的实时性。

然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。
发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的。

于是使用的代码如下:

public boolean isConnected(){
    try{
        s.sendUrgentData(0xFF);
        return true;
    }catch(Exception e){
        return false;
    }
}

通过测试发现,系统可以迅速检测到网络的状态!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 6,693评论 2 12
  • 最近在学习Python看了一篇文章写得不错,是在脚本之家里的,原文如下,很有帮助: 一、网络知识的一些介绍 soc...
    qtruip阅读 7,675评论 0 6
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 8,700评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • 郑伯克又发来信息,作为群主,他在群里@所有人——有同学得了白血病,医疗费昂贵,号召大家捐款。 捐款是个好东西,不仅...
    原疯不动阅读 3,051评论 1 3