socket.sendUrgentData判断网络远端是否断开连接

来自于 http://chenke1215.blog.163.com/blog/static/124414520103611222617/

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。

首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。

然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。

最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!

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

try{
     
socket.sendUrgentData(0xFF);
}catch(Exception
ex){
      reconnect();
}

socket.sendUrgentData判断网络远端是否断开连接,布布扣,bubuko.com

时间: 2024-11-12 16:05:31

socket.sendUrgentData判断网络远端是否断开连接的相关文章

判断网络远端服务器是否断开连接(心跳连接:socket.sendUrgentData)

1.socket类的方法isClosed().isConnected().isInputStreamShutdown().isOutputStreamShutdown()等,这些方法都是本地端的状态,无法判断远端是否已经断开连接. 2.是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping.但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开. 3.回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出

socket 如何判断远端服务器的连接状态?连接断开,需重连

fluent-logger-java is a Java library, to record events via Fluentd, from Java application. https://github.com/fluent/fluent-logger-java 使用该sdk过程发现,tcp连接断开之后,该sdk的重连机制无效. 2018-01-26 12:36:25,620 ERROR [org.fluentd.logger.sender.RawSocketSender] - <org

JAVA 判断Socket 远程端是否断开连接

最近在做项目的时候,遇到这样一个问题,如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如  isClosed().isConnected().isInputStreamShutdown().isOutputStreamShutdown()等,在测试时发现,这些方法都是本地端的状态,无法判断远端是否已经断开连接. 其实在socket类中有一个方法sendUrgentData,它会往输出流发送一个字节的数据,只要对方Socket的S

(笔记)Linux服务器中判断客户端socket断开连接的方法

下面来罗列一下判断远端已经断开的方法:(转自http://blog.csdn.net/god2469/article/details/8801356) 法一: 当recv()返回值小于等于0时,socket连接断开.但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接. 法二: struct tcp_info info;   int len=sizeof(in

TCP socket如何判断连接断开

http://blog.csdn.net/zzhongcy/article/details/21992123 SO_KEEPALIVE是系统底层的机制,用于系统维护每一个tcp连接的. 心跳线程属于应用层,主要用于终端和服务器连接的检查. 即使SO_KEEPALIVE检测到连接正常,但并不能保证终端和服务器连接的正常.有一种情况,服务器进程死了,但它和客户端的tcp连接还连着(该连接由系统维护的). 这就是SO_KEEPALIVE不能取代心跳线程的原因吧. ###################

Tcp服务端判断客户端是否断开连接

今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接. 然后就开始找各种方法.其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因............ 参考的方法: 下面来罗列一下判断远端已经断开的方法: 法一: 当recv()返回值小于等于0时,socket连接断开

Android中判断网络连接是否可用及监控网络状态

Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android中判断网络连接是否可用及监控网络状态,感兴趣的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

使用ConnectivityManager 判断网络是否连接

网络连接状态对那些依赖网络的APP是必须的.以下有两种方法实现了对网络的检查.组合使用效果更加 第一中方法:使用ConnectivityManager 检查网络连接 主要步骤: (1)获取ConnectivityManager对象. (2)使用ConnectivityManager对象的getActiveNetworkInfo获取NetworkInfo 对象. (3)使用ConnectivityManager对象的getNetworkInfo获取NetworkInfo对象,然后调用Network

Android判断网络连接状态

需要相关权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.INTERNET"/