1.1 方法一:应用层自己实现的心跳包

  由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没 有收到服务器的心跳包,则认为连接不可用。

1.2 方法二:TCPKeepAlive保活机制

  因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用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 保证长连接的两种方式相关推荐

  1. 客户端与服务端长连接的几种方式

    客户端与服务端长连接的几种方式 前言 一.ajax 轮询 二.long poll 长轮询 三.iframe 长连接 四.WebSocket 前言 在日常 Web 项目中,通常使用的是短连接.即一个 R ...

  2. Java连接Oracle两种方式thin与oci区别

    Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...

  3. Java中Http连接的两种方式

    在java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部 ...

  4. Mysql数据库远程连接的两种方式

    mysql 远程连接数据库的二种方法 一.连接远程数据库: 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root" ...

  5. erl0007 - erlang 远程节点连接的两种方式

    启动连接:erl -setcookie abc -name xxx@192.168.x.x -remsh xxx@192.168.x.y 退出:ctrl + g,q 参考:http://www.cnb ...

  6. Android10下wifi连接的两种方式:点对点连接和外网连接

    因为Android下的API总是在变,权限越来越少.导致出现的问题层出不穷,所以我们只好按照官方手册去开发了. 在看了手册后,我们知道连接网络有两种: 1.点对点连接,意思就是我们直接去连接自己指定的 ...

  7. android蓝牙耳机接入,Android跟蓝牙耳机建立连接有两种方式

    2. 蓝牙耳机主动跟Android 连首先BluetoothAudioGateway 会在一个线程中收到来自蓝牙耳机的RFCOMM 连接,然后发送消息给BluetoothHeadsetService. ...

  8. python+selenium web浏览器全屏长截图的两种方式

    1.此方法只适用于能够无头方式运行的浏览器,比如:chrome def get_image(url,pic_name):# chromedriver的路径chromedriver = r"D ...

  9. 计算机连接到网络的接口,路由器与计算机连接的三种方式及设置介绍

    如何将路由器连接到计算机进行设置?目前,随着计算机.智能手机.平板电脑等网络设备的普及,人们对网络的需求日益增加,这促进了路由器的广泛使用.然而,大多数用户不知道如何将路由器与计算机连接起来,然后进行 ...

最新文章

  1. 从实战中了解数据开发全流程——DataWorks OpenAPI实战
  2. LINQ之路 5:LINQ查询表达式
  3. 在Java EE组件中使用骆驼路线
  4. php json追加500错误,在composer.json中添加了一个git地址;composer update 报错
  5. 安装veket到移动硬盘NTFS分区
  6. 如何在网上获取国际、国内的学术会议消息
  7. 激光雷达(LiDAR)简介-森林资源调查应用
  8. 【系列笔记一】-USYD悉尼大学Data1002 Grok Module 3 课件 作业 assignment讲解
  9. 概率统计Python计算:全概率公式
  10. ios11对比android8.0,谁的设计更好?iOS11正式版多图详尽对比安卓8.0
  11. 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式
  12. 互联网技术-alibaba-gateway网关中routers路由匹配规则
  13. Java后端笔记 _Static关键字
  14. Mybatis Maven依赖
  15. 抹不掉的消费数字足迹!那些悄然消失的花呗额度……
  16. 自定义View -- 蜘蛛网图
  17. wordpress空间访问gravatar头像方法汇总
  18. 使用Vue框架实现NGA客户端
  19. 想做数据分析岗位,互联网数据分析的发展前景怎么样?
  20. Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)

热门文章

  1. pycharm安装django失败
  2. 今日份弱智代码2022.10.9
  3. 药物四大专题专享限时报一送一(CADD+AIDD+AMBER+GROMACS)
  4. 【牛客网】BC23 时间转换
  5. Watchdog 杀掉系统进程重启问题分析
  6. 服务器网卡收包性能测试
  7. 语句与语法笔记:学会python中_doc_和pydoc——python学习手册笔记之3
  8. 天津理工大学计算机考研资料汇总
  9. ActiveX 部件不能创建对象: 'scripting.FileSystemObject'
  10. Tic-Tac-Toe可能棋局遍历的实现(python)