咨询热线:15288205895 联系人:黄国强 地址:沙河百沙路新飞达电子科技发展中心
网络通信之检测远端连接是否断开连接
来源:同乐城备用 发布时间:2019-10-29 点击量:6
判断对方是否断开连接:
一、方法层面的实现:
1,使用输入流的read方法:
输入流的read(byte[] ,int ,int) 方法,表示从当前的通道中读取数据,具体读取到的数据有返回的int值决定;这里的返回值和抛出的异常很重要,如果抛出IOException异常,很明显连接已经断开;
返回值说明:
针对于基于tcp/ip协议的socket连接说明:
如果没有设置socket的soTimeout属性,那么该方法将是一个阻塞方法,可以通过设置socket的soTimeout属性,让read方法退出。
注意:read方法如果timeout将以抛出socketTimeoutException异常;
客户端:
如果对方断开连接,客户端的read方法将返回-1;
服务器端:
如果对方断开连接,服务器端的read方法将抛出IOException异常;
提示:
建议使用这种方式,netty底层源码就是使用的这种方式实现的;
2,使用socket 的sendUrgentData(int) :
注意:不建议使用此种方式,因为使用该方式有很多不可预测的情况;
通常情况是:接收端没有开启socket的SO_OOBINLINE属性,那么使用sendUrgentData(int)测试连接时,在发送17次(windows测试数据)时会发生异常;而如果接收端开启socket的SO_OOBINLINE属性,那么接收端就会收到发送的数据,从而导致真实数据的混乱;
socket sendUrgentData(int) 17次异常说明;
对于17次发送异常,在一片文章中有看到,说:如果接收端没有开启socket的SO_OOBINLINE的属性(当然这也是想把该方法用于心跳检测的必须条件),那么接收端将抛弃接收到的这个数据,也不会向发送端返回对应的ack值;但是,发送端却会占用一个tcp/ip的发送窗口,一直等待接收端的返回,这里肯定等待不到,就会一直占用窗口;而一个tcp/ip基于平台只有8或16个窗口,于是,在第17次发送数据时抛出异常了;
意思,作者是懂的,但真正的底层实现却不太清楚;提供tcp/ip窗口详解连接:
https://technet.microsoft.com/zh-cn/library/2007.01.cableguy.aspx
二、协议层面的实现:
通过自定义的心跳机制,这也是最常用的方式之一;
示例实现:
定义了一个抽象的通道处理类,提供远端断开连接的判断;
import java.io.IOException;import java.io.InputStream;import java.net.SocketTimeoutException;/** * 提供基于tcp/ip协议连接的断开判断实现 * @author pineapple food * */public abstract class AbstractChannelHandler { /* * 连接关闭标志 */ private boolean closed; /** * 尝试从输入流中读取数据,具体读取数据的数量,依据返回的int值作为依据; * @param buf 缓存区 * @param index 起始地址 * @param length 读取长度 * @return 值大于零,表示读取到返回值表示大小的数据;等于0: 表示未读取到数据; 等于-1:表示远端已关闭连接; */ public int tryReadMsg(byte[] buf ,int index ,int length) { int result = 0; try { result = inputStream().read(buf, index, length); } catch (SocketTimeoutException e) { result = 0; } catch (IOException e) { result = -1; setClosed(); } return result; } protected void setClosed() { closed = true; } /** * 连接是否关闭 * @return false 未关闭; true 关闭 */ public boolean isClosed() { return closed; } /** * 向远端连接发送心跳数据; */ protected void sendHeartbeat() {} /** * 通过协议层的心跳发送,判断远端连接是否关闭; * @return */ protected boolean isClosedBySendHeartbeat() { return false; } /** * 设置socket 输入流的读取超时时间,用于设置{@link tryReadMsg(byte[] ,int ,int)} 方法的timeout时间 * 否则将一直阻塞; */ abstract protected void setSoTimeout(); /** * 返回与该通道相关联的输入流; * @return */ abstract protected InputStream inputStream() throws IOException;}
通道处理类,继承与上述抽象类,方便断开连接的判断
import java.io.IOException;import java.io.InputStream;import java.net.Socket;import java.net.SocketException;public class ChannelHandler extends AbstractChannelHandler{ private Socket socket; private InputStream is; public ChannelHandler(Socket socket) { this.socket = socket; setSoTimeout(); } @Override protected InputStream inputStream() throws IOException { if(is == null) { is = socket.getInputStream(); } return is; } @Override protected void setSoTimeout() { try { socket.setSoTimeout(1000); } catch (SocketException e) { } }}
demo,亲测可用:
static public void test() throws IOException { String host = "127.0.0.1"; Socket socket = new Socket(); socket.connect(new InetSocketAddress(host, 6800)); ChannelHandler channelHandler = new ChannelHandler(socket); byte[] b = new byte[20]; while(true) { int n = channelHandler.tryReadMsg(b, 0, b.length); if(n == -1 || channelHandler.isClosed()) { System.out.println("___________ connection is closed"); break; } if(n > 0) { byte[] data = new byte[n]; System.arraycopy(b, 0, data, 0, n); System.out.println(n + " : receive data = "+new String(data)); } } }
相关产品
-
归根究底,这是由于全球首台识别衣物的物联网纤见洗衣机,搭载物联识别及纤维级洗护科技“量衣定制”专属洗护方案;双子云裳则搭载一机双筒设计,满足用户分区洗护的高端诉求。需求决定市场,正是由于高端用户生活层次的提升与消费认知的升级,才诞生了行业首个卡萨帝衣物护理中心,重新定义高端生活。
-
由她参演的萌宠动作电影《营救汪星人》将于2018年春节档上映,早就在大院线电影中有过精彩表现的赵宇彤,这次银幕中是否会给我们带来全然不同的惊喜?这恐怕要走进影院才知道了。
-
10月21日晚,中央电视台一套《焦点访谈》栏目播出“垃圾短信哪里来”,称垃圾短信的头号推手是三大运营商,这是其自今年3.15晚会和近期《每周质量报告》曝光这一问题后,主流媒体第三次剑指三大运营商。
-
2017上海车展,广汽传祺新能源品牌正式发布,口号为“广汽传祺新能源 能所不能”,并集中发布四款新品。由北美车展全球首发的传祺GE3领衔,概念车EnSpirit国内首发、GS4 PHEV首发、GA3S PHEV公布价格。
-
XXX:上课专心听讲,善于思考,上进心强。每次的作业都完成得不错。学习成绩上不去的主要原因是没有掌握好正确的学习方法。要注意团结好同学。望你继续努力,我等着你的好消息。
-
传闻中游泳运动员“腿短腰长”的说法也在他这里得到印证。“除了绝对身高比较高之外,你看菲尔普斯1.9米多的个子,找个身高差不多的篮球运动员,肯定菲尔普斯的坐高要高。为什么需要腰要长一点呢?因为在水中,人体的重心和浮心比较接近。腿上有什么?骨头和肌肉,是压重量的,不像胸腔像一个大气球一样。如果是腿长腰短,可能腿会很重,游到后来就会沉下去。”
-
最后,伦敦在创立交易基准方面的经验为世界公认和借鉴。包括基准汇率、伦敦银行同业拆借利率(Libor)等在全球商业合同、基金、投资组合与衍生品交易中得到广泛应用,巩固了伦敦主要国际人民币中心的地位。
-
1、集合与解散:出发前一天在成都市入住酒店集合(自愿选择),行前说明会在19:00准时开始,请在此时间前抵达。解散在D20,预计当日下午14点左右到达西宁城区,旅行时间较长,建议到达拉萨之后再预订返程的交通工具。
热点资讯
- 小米生态链出品,小白1080P智能摄像机云台版149元2019-06-23
- 清爽一夏:波司登纯棉休闲裤2条129元、花花公子弹力休闲裤49元2019-10-29
- 对阵莱万特的19人名单_体育2019-06-23
- 《天堂2:誓言》更新全新系统专门技术2019-10-29
- 晋江经验:小村企大希望2019-06-23
- 体验美帝警察日常《追击罪犯》抢先登陆Steam2019-06-23
- 粉丝自制微软SurfacePhone概念机:双铰链三屏幕折叠,手机秒变笔电2019-06-23
- 腾讯直播|东莞第三届中国家居绿色供应链论坛2019-10-29