Socket如何保证长连接

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

方法2:TCP的KeepAlive保活机制
因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用TCP/IP协议层为内置的KeepAlive功能来实现心跳功能则简单得多。 不论是服务端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。 因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不开启KeepAlive功 能,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,KeepAlive设置不合理时可能会 因为短暂的网络波动而断开健康的TCP连接。并且,默认的KeepAlive超时需要7,200,000 MilliSeconds, 即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长。因此,我们需要手工开启KeepAlive功能并设置合理的KeepAlive参数。
以上转自网络。

心跳包机制

跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
   在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
   心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
   其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
   在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
   总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

心跳检测步骤:
1客户端每隔一个时间间隔发生一个探测包给服务器
2客户端发包时启动一个超时定时器
3服务器端接收到检测包,应该回应一个包
4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

原文地址:https://www.cnblogs.com/sidesky/p/12539012.html

时间: 2024-10-14 09:58:29

Socket如何保证长连接的相关文章

Socket服务端口长连接最多能支持多少?

答案是无限的.视服务端的资源而不同. 以前一直认为服务端在Accept客户端连接后,会开启一个新的端口与客户端建立链路,但这是错误的.事实上,一个连路是由Server IP+server Port + client IP + client port唯一定义.那么监听服务打开80时意味着这个服务打开了一个文件,当有client接入时,只要没有重复的链路,都会创建一个新链路,那么对于server端还是同一个端口,与客户端实现了同一个服务端口与不同的client建立了长/短连接的链路. 而以前在用C写

socket.io建立长连接

socket.io是基于node.js,在命令行里输入npm socket.io下载模块,用node.js搭建后台 示例代码,客户端 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Node.js</title> 6 <script type="text/java

java如何实现Socket的长连接和短连接

讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建一个Socket,处理完一个请求就直接关闭掉Socket.所以,其实区分长短连接就是:整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的. 可能你会想:这还不简单,长连接不就是不关Socket嘛,短连接不就是每次都关Socket每次都new Socket嘛.然而事实其实并没有

Socket的长连接和短连接

讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建一个Socket,处理完一个请求就直接关闭掉Socket.所以,其实区分长短连接就是:整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的. 可能你会想:这还不简单,长连接不就是不关Socket嘛,短连接不就是每次都关Socket每次都new Socket嘛.然而事实其实并没有

Jmeter单个长连接发送多个Sample

Mark自:https://blog.csdn.net/lykangjia/article/details/16337505 1. 线程组,在我们测试方案里面,每个线程模拟一个用户,执行用户的登录.等等等一系列的操作.由于我们的项目是长连接的,如何能实现多个sample公用一个长连接客户端,考虑了很久,最后实现方法如下: 1 package tea.client.network; 2 /** 3  * @author Teaey 4  * @creation 2012-8-25 5  */ 6

利用Ajax实现长连接(模拟推送,半长连接)

很多程序都可以通过socket来实现长连接,实现消息的即时推送.但由于http请求一般都是短连接,一次请求结束,就会断开与服务器的连接,服务器不能主动推送数据到客户端,而只能由客户端发起请求,但有些时候,需要在web上实现即时的消息传输,比如即时聊天.股票动态信息等. 在Ajax技术被发掘以前,在网页上实现无刷新的即时聊天,似乎是很困难的事情,但由于Ajax技术的兴起,人们可以进一步来挖掘它的潜力了,象gmail.google gtalk的网页版,都是Ajax长连接的重要应用,目前很多网站可能都

移动互联网长连接方案实例(转)

http://dragonsoar.iteye.com/blog/1567771 1.笔者本人现在在一家创业公司担当整个平台架构的角色,而这家公司是做一移动互联网相关的一些应用产品,由其现在正在和中国最大的互联网公司之一进行合作,负责该互联网公司的手机终端的长连接推送服务,所以有一些总结特在此和大家分享一下. 2.下面这篇文章是笔者在几个月前做的一篇长连接的总结,所以可能写的不是非常严谨,特给javaer们进行一些参考即可,有如下几个数据和大家一起分享下: 1) 单JVM实现了50W以上长连接,

[转] iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

? 转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候基本上会被苹果Reject. 但是如果你的应用是企业内部发布的或者你只想了解其中的原理,那该文也许对您会有所帮助. 一.在iOS中如何应用VOIP VOIP程序需要稳定的网络去

Java实现Socket长连接和短连接

1概念 Socket:socket实际上是对TCP/IP进行的封装,我们可以使用socket套接字通过socket来传输.首先我们需要明白的一个概念就是通道,简单地说通道就是两个对端可以随时传输数据的信道.我么常说的所谓建立socket连接,也就是建立了客户端与服务器端的通道. 长短连接:显而易见,长连接也就是这个socket连接一直保持连接,也就是通道一直保持通畅,两个对端可以随时发送和接收数据:短连接就是我们发送一次或有限的几次,socket通道就被关闭了.首先,我们必须明白的是socket