出于最近对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
原文:
http://blog.csdn.net/iamdesmo/article/details/7439193
分享到:
相关推荐
以下是Socket长连接、心跳包和数据发送读取的关键知识点: 1. **TCP连接**:Socket基于传输层的TCP协议,提供可靠的双向通信。TCP保证了数据的顺序和完整性,通过三次握手建立连接,四次挥手断开连接。 2. **...
通过分析和学习这个项目,你可以更直观地了解上述知识点的实现方式,包括如何创建Socket连接、实现心跳包、处理消息回调以及服务端的多线程处理等。 总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端...
socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...
- 这个文件可能是一个服务(Service),负责接收和处理来自客户端的Socket连接和心跳包。 - 服务启动后,监听指定端口,当有新的Socket连接请求时,创建线程处理客户端的输入输出流,同时处理心跳检测。 6. **...
Socket长连接心跳是网络通信中保持连接活性的重要技术,尤其在移动端如安卓应用中更为常见。Socket,全称是“套接字”,是网络编程的基本接口,它允许应用程序通过网络发送和接收数据。心跳机制则是确保连接持续有效...
Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short Connection)** 短连接通常用于一次性、非持久性的通信,如HTTP协议就是典型的短连接。在短连接中...
心跳包在TCP通信中起到了关键作用,它能检测到网络连接的中断并及时通知应用程序,避免因长时间无数据传输导致的假死连接。 在Winform应用中实现socket心跳包,通常包括以下几个步骤: 1. 创建Socket对象:在C#中...
心跳包的设计可以防止网络延迟或丢包导致的假死连接,同时也可用来检测并及时处理异常情况。 实现TCP长连接Socket心跳收发消息的过程通常包括以下步骤: 1. 建立TCP连接:客户端发起连接请求,服务器响应,完成三...
心跳包是维持网络连接稳定性的关键技术,尤其在长连接中,例如TCP连接。心跳包定期发送,以确认连接仍然活跃并检测可能的网络问题。 6. **实现心跳包机制**:在Winform Socket通信中,心跳包通常由服务器或客户端...
心跳包机制在网络通信中扮演着重要角色,特别是在长时间无数据交换或需要检测连接状态的场景下。在Netty中,心跳包可以是自定义的协议消息,服务器和客户端定期交换这些消息以确认连接的活跃性。如果在预设时间内...
标题“c# Socket长连接 短链接 自己封装 通讯”揭示了我们将讨论的主题:如何使用C#实现Socket的长连接和短连接,并自定义通信协议。这里的关键点包括: 1. **Socket基础**:Socket是网络通信中的一个抽象概念,它...
Socket长连接是网络编程中的一个重要概念,特别是在设计高并发、实时性要求高的系统时,它被广泛应用。Socket,又称套接字,是网络通信的基本单位,提供了进程间、网络间进程通信的一种接口。本示例可能是一个关于...
1. **建立Socket连接**:客户端使用`Socket`类的构造函数,指定服务器的IP地址和端口号,建立到服务器的连接。 2. **心跳包设计**:定义心跳包的格式,例如可以是一个简单的JSON对象,包含时间戳和"ping"或"pong"的...
在C#中,System.Net.Sockets命名空间提供了Socket类,用于创建和管理socket连接。 在“异步”方面,C#的Socket支持异步操作模式,这意味着你可以启动一个网络操作(如连接、接收或发送数据),然后继续执行其他任务...
5. **心跳机制**:为了检测客户端是否在线,可以定时发送心跳包,如果连续几次没有收到回应,则认为客户端已掉线。 6. **资源释放**:在完成通信后,记得关闭Socket和相关的I/O流,以释放系统资源。 理解并掌握这些...
心跳机制是指在网络通信中,通过定期发送心跳包来维持连接的机制,以避免连接超时或断开。 在C#中,使用Socket编程来实现心跳机制可以通过以下步骤实现: 首先,需要创建一个Socket对象,并设置其连接参数,如IP...
C#高级编程之实现Socket心跳机制,TCP网络长连接。 心跳包之所以叫心跳包是因为:...总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
- 使用`Socket`类连接到服务器端,获取`OutputStream`用于发送心跳包,`InputStream`用于接收心跳包。 - 同样,客户端也需要开启一个线程持续发送心跳包,并且在主线程中接收服务端的心跳包。 - 客户端心跳包发送...
在TCP(传输控制协议)中,心跳包是一种保持连接活性的机制,主要用于检测网络连接是否仍然有效,防止因网络静默导致的连接超时或断开。本篇将详细讲解如何使用C语言在Linux平台上实现TCP心跳包的功能,并探讨其核心...
4. 长连接需要保持Socket连接状态,通常会设置心跳机制,定期发送心跳包以检查连接是否正常。 三、客户端对服务器发送消息 1. 客户端通过Socket的OutputStream将要发送的消息编码成字节流,然后写入到输出流。 2. ...