Socket 保证长连接的两种方式
1.1 方法一:应用层自己实现的心跳包
由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer
事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没 有收到服务器的心跳包,则认为连接不可用。
1.2 方法二:TCP
的KeepAlive
保活机制
因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用TCP/IP
协议层为内置的KeepAlive
功能来实现心跳功能则简单得多。 不论是服务端还是客户端,一方开启KeepAlive
功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。 因为开启KeepAlive
功能需要消耗额外的宽带和流量,所以TCP
协议层默认并不开启KeepAlive
功 能,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,KeepAlive
设置不合理时可能会 因为短暂的网络波动而断开健康的TCP
连接。并且,默认的KeepAlive
超时需要7,200,000 MilliSeconds
, 即2
小时,探测次数为5
次。对于很多服务端应用程序来说,2
小时的空闲时间太长。因此,我们需要手工开启KeepAlive
功能并设置合理的KeepAlive
参数。
以上转自网络。
1.3 心跳包机制
跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP
的机制里面,本身是存在有心跳包的机制的,也就是TCP
的选项:SO_KEEPALIVE
。系统默认是设置的2
小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
心跳包一般来说都是在逻辑层发送空的echo
包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
其实,要判定掉线,只需要send
或者recv
一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40
秒比较不错。如果实在要求高,那就在6-9
秒。
心跳检测步骤:
1.客户端每隔一个时间间隔发生一个探测包给服务器
2.客户端发包时启动一个超时定时器
3.服务器端接收到检测包,应该回应一个包
4.如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5.如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了
转自:http://blog.sina.com.cn/s/blog_a459dcf5010153m5.html
Socket 保证长连接的两种方式相关推荐
- 客户端与服务端长连接的几种方式
客户端与服务端长连接的几种方式 前言 一.ajax 轮询 二.long poll 长轮询 三.iframe 长连接 四.WebSocket 前言 在日常 Web 项目中,通常使用的是短连接.即一个 R ...
- Java连接Oracle两种方式thin与oci区别
Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...
- Java中Http连接的两种方式
在java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部 ...
- Mysql数据库远程连接的两种方式
mysql 远程连接数据库的二种方法 一.连接远程数据库: 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root" ...
- erl0007 - erlang 远程节点连接的两种方式
启动连接:erl -setcookie abc -name xxx@192.168.x.x -remsh xxx@192.168.x.y 退出:ctrl + g,q 参考:http://www.cnb ...
- Android10下wifi连接的两种方式:点对点连接和外网连接
因为Android下的API总是在变,权限越来越少.导致出现的问题层出不穷,所以我们只好按照官方手册去开发了. 在看了手册后,我们知道连接网络有两种: 1.点对点连接,意思就是我们直接去连接自己指定的 ...
- android蓝牙耳机接入,Android跟蓝牙耳机建立连接有两种方式
2. 蓝牙耳机主动跟Android 连首先BluetoothAudioGateway 会在一个线程中收到来自蓝牙耳机的RFCOMM 连接,然后发送消息给BluetoothHeadsetService. ...
- python+selenium web浏览器全屏长截图的两种方式
1.此方法只适用于能够无头方式运行的浏览器,比如:chrome def get_image(url,pic_name):# chromedriver的路径chromedriver = r"D ...
- 计算机连接到网络的接口,路由器与计算机连接的三种方式及设置介绍
如何将路由器连接到计算机进行设置?目前,随着计算机.智能手机.平板电脑等网络设备的普及,人们对网络的需求日益增加,这促进了路由器的广泛使用.然而,大多数用户不知道如何将路由器与计算机连接起来,然后进行 ...
最新文章
- 从实战中了解数据开发全流程——DataWorks OpenAPI实战
- LINQ之路 5:LINQ查询表达式
- 在Java EE组件中使用骆驼路线
- php json追加500错误,在composer.json中添加了一个git地址;composer update 报错
- 安装veket到移动硬盘NTFS分区
- 如何在网上获取国际、国内的学术会议消息
- 激光雷达(LiDAR)简介-森林资源调查应用
- 【系列笔记一】-USYD悉尼大学Data1002 Grok Module 3 课件 作业 assignment讲解
- 概率统计Python计算:全概率公式
- ios11对比android8.0,谁的设计更好?iOS11正式版多图详尽对比安卓8.0
- 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
- 互联网技术-alibaba-gateway网关中routers路由匹配规则
- Java后端笔记 _Static关键字
- Mybatis Maven依赖
- 抹不掉的消费数字足迹!那些悄然消失的花呗额度……
- 自定义View -- 蜘蛛网图
- wordpress空间访问gravatar头像方法汇总
- 使用Vue框架实现NGA客户端
- 想做数据分析岗位,互联网数据分析的发展前景怎么样?
- Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)
热门文章
- pycharm安装django失败
- 今日份弱智代码2022.10.9
- 药物四大专题专享限时报一送一(CADD+AIDD+AMBER+GROMACS)
- 【牛客网】BC23 时间转换
- Watchdog 杀掉系统进程重启问题分析
- 服务器网卡收包性能测试
- 语句与语法笔记:学会python中_doc_和pydoc——python学习手册笔记之3
- 天津理工大学计算机考研资料汇总
- ActiveX 部件不能创建对象: 'scripting.FileSystemObject'
- Tic-Tac-Toe可能棋局遍历的实现(python)