出于最近对im研究的兴趣,看到smack里有个30s发送一个空消息的线程,了解了下关于心跳包,keepalive的知识。 TCP的socket本身就是长连接的,那么为什么还要心跳包呢?

搜索到的资料解释如下:

一:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。

二:理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

三:

如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确定连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
这取决于你的server端的超时配置, 每个socket连接都是长连接,它是一个相当占用系统资源的通信管道, 如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。
所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)。
记得以前开发手机游戏时,索爱有一款手机有强制要求,客户端如果超过三分钟无消息发向网络服务端,则会在客户端自动地强制把socket关断。因为socket长连接相对于手机这样资源少的设备来说是宝贵的资源。  (这个强制是指客户端系统自动关的,不是我们代码close的) 

这3个原因都是挺有道理。如果你有更好的解释欢迎交流啊。改天我做个程序测试一下不发心跳包和发心跳包的连接情况。

来源:1.http://blog.csdn.net/qgjava/article/details/5745776

2.http://topic.csdn.net/u/20081009/13/abd12947-e78e-43ba-9a43-ce690ecb8ac2.html

3.http://zhidao.baidu.com/question/349886234.html

关于socket长连接的心跳包相关推荐

  1. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...

  2. java nio socket长连接_nio实现Socket长连接和心跳

    前段时间用bio方式,也就是传统io实现了socket的长连接和心跳,总觉着服务端开启多线程管理socket连接的方式过于消耗资源,数据并发的情况下可能会影响到性能,因此就尝试使用nio改进原来的代码 ...

  3. php 长连接 心跳包,Swoole中的长连接和心跳包

    长连接说简单一点就是不会断的连接 

  4. 长连接与心跳包 Persistent connection and HearBeats

    http://stackoverflow.com/questions/1480236/does-a-tcp-socket-connection-have-a-keep-alive http://sta ...

  5. 聊聊 TCP 长连接和心跳那些事

    1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次握手,四次挥手的认识,我觉得这样的原因主要在于 TCP 协议本身稍微有点抽象(相比较于应用层的 HTTP 协议):其次,非框架开发者不 ...

  6. android端 socket长连接 架构

    看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...

  7. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

  8. TCP长连接,心跳机制介绍

    TCP长连接,心跳机制介绍 长连接 为何要长连接 心跳 心跳为何设置在服务器端 心跳维持长连接 TCP keep-alive的三个参数 参数的具体意义 心跳的使用场景 长连接 TCP经过三次握手建立连 ...

  9. 安卓中socket长连接和websocket长连接的实现

    现在一款成熟的app一般都会具备长连接推送功能,那么我们要想项目具备长连接的功能现在又两种选择的方案,一种基于原生tcp协议的socket长连接,另外一种基于ws协议的websocket的长连接,今天 ...

最新文章

  1. Apache CXF实战之六 创建安全的Web Service
  2. 在研究所工作是什么体验?和互联网公司比,你会怎么选?
  3. 皮一皮:原来网恋就是这个感觉...
  4. mysql 线程内存 回收_MySQL内存使用-线程独享
  5. 【一周入门MySQL—4】数据库进阶练习
  6. VHDL操作运算符的优先级顺序
  7. java 垃圾回收手动回收_Java垃圾回收(4)
  8. C++计算函数执行时间的两种方法
  9. 设计模式(八)组合模式 Composite
  10. Bean的生命周期详解
  11. 小马哥---高仿山寨三星S8出世 谨防购买到假货!! 高仿三星S8 s305刷机拆机主板图示
  12. html背景图片循环自动播放,CSS3 背景图循环播放
  13. MapReduce之简单K-mer计数
  14. JavaC++题解与拓展——leetcode728.自除数【跳出多层循环,vector at】
  15. 2022 数学建模C题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路
  16. PROFINET 概念
  17. 监听器(统计在线人数)
  18. 游侠联机服务器没有响应,求助,游戏联机出现错误 - 《生存之旅2》 - 3DMGAME论坛 - Powered by Discuz!...
  19. 电路中滤波电容和退耦电容_关于滤波电容、去耦电容、旁路电容作用及其原理...
  20. JavaScript面试题整理汇总

热门文章

  1. Speedoffice(PPT)怎么自定义设置幻灯片大小
  2. 高新技术企业避坑解读之“盲目跟风”
  3. 我薅了四年的国内外免费服务器
  4. Google的垂直搜索
  5. 基于cobra的go语言命令行解析器
  6. RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程
  7. 获取当前登录用户的IP地址代码
  8. CMD控制台提示“telnet不是内部或外部命令,也不是可运行的程序或批处理文件”
  9. 新建Flutter项目
  10. NOIP 考后欢乐赛 T2 中国象棋