CN106506253A - 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 - Google Patents
一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 Download PDFInfo
- Publication number
- CN106506253A CN106506253A CN201610812469.4A CN201610812469A CN106506253A CN 106506253 A CN106506253 A CN 106506253A CN 201610812469 A CN201610812469 A CN 201610812469A CN 106506253 A CN106506253 A CN 106506253A
- Authority
- CN
- China
- Prior art keywords
- client
- server
- node
- event
- tcp
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L43/00—Arrangements for monitoring or testing data switching networks
- H04L43/10—Active monitoring, e.g. heartbeat, ping or trace-route
Landscapes
- Health & Medical Sciences (AREA)
- Cardiology (AREA)
- General Health & Medical Sciences (AREA)
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明提供的基于TCP/IP通信协议的在线客户端数量的统计系统,包括:服务器及与服务器连接的至少一客户端,服务器用于创建动态链表,动态链表包括一头结点和若干子结点,每个结点通过指针域next依次串联构成所述动态链表,服务器通过调用epoll_wait函数,判断客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明利用epoll服务器通信模型,通过动态链表的方式统计在线客户端的数量,并加入了客户端心跳包处理机制,结合动态链表,能够及时的对异常断开的客户端所在的结点进行清理,从而提高了在线客户端数量统计的准确性。
Description
技术领域
本发明涉及网络通信技术领域,尤其是涉及一种基于TCP/IP通信协议的在线客户端数量的统计系统及方法。
背景技术
目前实现在线客户端人数,最高访问用户数的统计的技术方案主要是针对基于HTTP协议的网站或者服务器的访问,比较成熟的方案是用Servlet规范中定义的事件监听器(Listener)来实现,但是只能进行粗略的统计,难以做到精确,比如,用户没有退出登录而直接关闭了浏览器,那么在服务器端的Session中,这个用户仍然是存在的,造成统计的误差‘
在物联网领域,大部分的穿戴式设备以及智能手机设备与服务器的连接往往是基于TCP协议的,针对linux系统而言,可以通过相关的指令查看服务器某个端口的TCP连接数来估算在线用户的数量,比如,统计80端口连接数可以采用以下指令,netstat-nat|grep-i"80"|wc–l,但是此方法也只能粗略的估计,而且只是知道数量,至于是什么用户在线,什么时候上线却没法获取,而且前面已经跟服务器建立连接的客户端,理论上连接可以一直长期维持下去,但实际情况并非如此,比如为了避免不必要的带宽资源浪费,网络运营商会将采用
GPRS通信的建立链接后一定时间内不进行数据传输的客户端自动断掉,实际上TCP断开的因素比较多,除非是服务器或客户端主动发起断开请求,否则对于因断电、网线拔掉、网络瘫痪、强行关闭客户端软件等原因造成的异常断开,服务器未必能够及时有效的监测到TCP连接的断开,如果还采用指令查看系统的具体端口的TCP的连接数的方法统计在线数量,显然统计出的在线客户端数量是不准确的,因为事先客户端与服务器建立连接的TCP即便异常断开了,但在服务器一直存在,实际上建立的是“死连接”,用户无法能继续和服务器进行通信。
发明内容
有鉴如此,有必要针对现在技术存在的缺陷,提供一种可以通过动态链表的方式统计在线客户端数量的系统。
为实现上述目的,本发明采用下述技术方案:
一种基于TCP/IP通信协议的在线客户端数量的统计系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
在一些实施例中,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量。
在一些实施例中,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。
另外,本申请还提供了一种基于TCP/IP通信协议的在线客户端数量的统计方法,包括下述步骤:
步骤S110:对所述服务器Socket通信参数进行初始化;
步骤S120:所述服务器建立并监听socket套接字描述符socket_fd;
步骤S130:对所述服务器的模型epoll进行初始化;
步骤S140:所述服务器创建动态链表并启动控制心跳包的系统定时器;
步骤S150:所述服务器调用epoll_wait函数,并判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,所述服务器遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为新的客户端发起TCP连接请求命令,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;
根据socket_fd调用accept函数返回新的socket套接字描述符,记为fd;
将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中。
在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立连接的客户端断开TCP连接的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否等于0,若是,进行下一步;若否,进行其他事务处理;
根据发起断开请求的客户端的fd查找结点所在位置,并将结点从所述动态链表中删除。
在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有上线命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEL;xxxxxxxxxxx;@的格式,其中,HEL是hello的缩写,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
对所述xxxxxxxxxxx和分配该客户端的fd进行提取,以开辟新结点,并将所述xxxxxxxxxxx和fd分别存储到新结点的id和fd中,且将heartbeat_lost_count初始化为0;
将所述新节点添加到所述动态链表的结尾。
在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有心跳包命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEART;xxxxxxxxxxx;@的格式,其中,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
根据客户端的ID查找客户端所在的动态链表中的结点位置;
将查到的和该客户端对应结点中的heartbeat_lost_count清零。
在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为心跳包监测的定时器中断服务事件,具体包括下述步骤:
判断当前遍历到的结点地址是否等于NULL;若是进下一步;
给所述动态链表中当前遍历到结点的heartbeat_lost_count按1步进递增;
判断heartbeat_lost_count是否大于5,若是,进行下一步;若否,遍历下一个结点;
判定为超时未发送心跳包,根据客户端的fd查找结点所在位置并将结点从动态链表中删除;
遍历下一个结点,并返回第一步。
在一些实施例中,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。
本发明采用上述技术方案的优点是:
本发明提供的基于TCP/IP通信协议的在线客户端数量的统计系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明提供的技术方案利用epoll服务器通信模型,提出了通过动态链表的方式统计在线客户端的数量;本发明还提出了增强统计准确性的机制,给每一个客户端提供有条不紊的心跳包控制机制,实时监测和处理异常断开的客户端,从而增强在线客户端数量统计方法的稳定性可靠性以及准确性。
附图说明
图1为本发明实施例提供的基于TCP/IP通信协议的在线客户端数量的统计系统的结构示意图。
图2为本申请一较佳实施例提供的动态链接的结构示意图。
图3为本申请提供的基于TCP/IP通信协议的在线客户端数量的统计方法的步骤流程图。
图4为本申请提供的新的客户端发起TCP连接请求的事件处理的步骤流程图。
图5为本申请提供的已经建立连接的客户端断开TCP连接的事件的步骤流程图。
图6表示为已经建立连接的客户端(结点2)发起断开请求的动态链表。
图7表示为将发起断开请求的客户端(对应结点2)从链表中删除并重构动态链表。
图8为本申请提供的已经建立TCP连接的客户端有上线命令传输的事件的处理流程图。
图9表示当前在线的客户端动态链表(数量为2)。
图10表示有新的客户端上线后的动态链表(数量为3)。
图11为本申请提供的已经建立TCP连接的客户端有心跳包命令传输的事件流程图。
图12为本申请提供的心跳包监测的定时器中断服务事件流程图。
图13为服务器压力测试(模拟)示意图。
图14为模拟客户端的TCP/IP调试工具。
图15为上线的客户端在前端web页面的显示示意图。
图16为服务器监视界面示意图。
具体实施方式
请参阅图1,本发明实施例提供的一种基于TCP/IP通信协议的在线客户端数量的统计系统,包括:服务器110及与所述服务器110TCP连接的至少一客户端120。
所述服务器110用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next。
优选地,该动态链表的结点数据结构id_fd_node定义如下:
typedefstructid_fd_str
{
char id[13];//存储客户端ID的字符数组
intfd;//存储服务器分配给已经建立连接的客户端的套接字描述符
intheartbeat_lost_count;//心跳包丢失统计相关变量
structid_fd_str*next;//存储指向下一个结点的地址
}id_fd_node;
请参阅图2,为本申请一较佳实施例提供的动态链接的结构示意图,该链表包括一个头结点和若干结点,每一个结点包括两部分:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,头结点指向第一个结点,第一个结点指向第二个结点,依次类推,最后一个结点不再指向其他结点,因此指针域用”null”填充。结点的长度等于当前与服务器建立TCP连接的客户端数量(也就是在线客户端的数量),客户端数据域包括三部分:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于服务器心跳包丢失统计的整型变量heartbeat_lost_count。
所述服务器110通过调用epoll_wait函数,判断所述客户端120是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
可以理解,对于服务器110而言,客户端120每次上线系统分配的fd都是随机的,具有不确定性,但是在系统中每一个客户端的ID都是固定的(用11位手机号码表示),本发明中利用链表的结点可以完美的将fd和用户的ID动态绑定起来,建立映射关系,只要知道ID就可以通过链表查找获取对应的fd,反之亦可。
请参阅图3,本申请提供的基于TCP/IP通信协议的在线客户端数量的统计方法的步骤流程图,包括下述步骤:
步骤S110:对所述服务器Socket通信参数进行初始化;
步骤S120:所述服务器建立并监听socket套接字描述符socket_fd;
步骤S130:对所述服务器的模型epoll进行初始化;
步骤S140:所述服务器创建动态链表并启动控制心跳包的系统定时器;
步骤S150:所述服务器调用epoll_wait函数,并判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,所述服务器遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next。
具体地,本申请提供的服务器110是运行在linux系统下,基于epoll通信模型,epoll是为处理大批量句柄而作了改进的poll。epoll具有以下优点,支持一个进程打开大数目的socket描述符(FD);IO效率不随FD数目增加而线性下降;使用mmap加速内核与用户空间的消息传递,理论上,1GB内存的linux操作系统机器,如果采用epoll服务器模型,大约可以支持10万个的客户端TCP/IP连接。
可以理解,epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用,使用非常简单,服务器110启动后,首先要进行一系列的初始化包括服务器Socket通信参数初始化,建立监听socket套接字描述符socket_fd,然后对服务器通信模型epoll初始化,再创建只包含头结点的链表和初始化并启动控制心跳包的系统定时器,最后调用epoll_wait函数,采用阻塞的方式等待客户端通信事件的触发,只有满足以下事件之一,服务器主程序才会退出epoll_wait函数,对客户端进行触发响应,客户端上线,下线,客户端之间的通信,在线客户端数量的变化,针对服务器而言,主要归结为以下的客户端的通信事件的发生和处理。
1、新的客户端发起TCP连接请求。
2、已经建立连接的客户端断开TCP连接的事件。
3、已经建立TCP连接的客户端有上线命令传输的事件。
4、已经建立TCP连接的客户端有心跳包命令传输的事件。
5、心跳包监测的定时器中断服务事件。
以下结合具体实施例分别对上述5种情况进行详细说明。
实施例1-新的客户端发起TCP连接请求
请参阅图4,为本申请提供的新的客户端发起TCP连接请求的事件处理的步骤流程图,包括下述步骤:
S11:epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;
S12:根据socket_fd调用accept函数返回新的socket套接字描述符,记为fd;
S13:将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中。
可以理解,该客户端事件的发生并不马上完成客户端的上线工作(需要下文的上线命令),只是需要客户端先发起TCP连接请求,才能获取服务器分配给它的fd,因为已经建立连接的客户端必须通过fd才能与服务器进行数据的传输,包括向服务器发送上线命令也是要知道客户端的fd。
实施例2-已经建立连接的客户端断开TCP连接的事件
请参阅图5,为本申请提供的已经建立连接的客户端断开TCP连接的事件的步骤流程图,包括下述步骤:
步骤S21:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
步骤S22:根据fd调用read函数;
步骤S23:判断read函数返回值是否等于0,若是,进行下一步;若否,进行其他事务处理;
步骤S24:根据发起断开请求的客户端的fd查找结点所在位置,并将结点从所述动态链表中删除。
可以理解,如果已经建立连接的客户端断开TCP连接,那么read函数的返回值为0,服务器会根据发起断开请求的客户端的fd查找结点所在链表中的位置并将结点从链表中删除掉。然后将该删除的结点的前后结点通过结点的指针域next连接起来构成新的链表,由此可见,该事件会使得在线客户端数量减少,而实际的在线客户端数量可以通过计算当前动态链表的长度(除了头结点)而得。
可以理解,通过上述操作后,动态链表的结构和长度将发生变化,请参阅如图6及图7,分别表示已经建立连接的客户端(结点2)发起断开请求及将发起断开请求的客户端(对应结点2)从链表中删除并重构动态链表。
实施例3-已经建立TCP连接的客户端有上线命令传输的事件
请参阅图8,为本申请提供的已经建立TCP连接的客户端有上线命令传输的事件的处理流程图,包括下述步骤:
步骤S31:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
步骤S32:根据fd调用read函数;
步骤S33:判断read返回值是否大于0,若是,进行下一步;若否,进行其他处理;
步骤S34:判断数据包是否为HEL;xxxxxxxxxxx;@的格式,其中,HEL是hello的缩写,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
步骤S35:对所述xxxxxxxxxxx和分配该客户端的fd进行提取,以开辟新结点,并将所述xxxxxxxxxxx和fd分别存储到新结点的id和fd中,且将heartbeat_lost_count初始化为0;
步骤S36:将所述新节点添加到所述动态链表的结尾。
可以理解,在服务器与客户端之间进行正常的数据收发之前,首先客户端根据服务器端的IP和端口号发起TCP连接请求,服务器监听到有新客户端连接后,在系统中会分配一个fd,接下来客户端还要按照下述格式来给服务器发送上线通知的命令才能算真正的上线,格式如下:HEL;xxxxxxxxxxx;@(HEL是hello的缩写,意思是向服务器打招呼,xxxxxxxxxxx是客户端的ID(手机号),用分号";"隔开,最后以@结束)
从图8中可以看出,服务器收到“HEL;xxxxxxxxxxx;@”的命令后,将会对xxxxxxxxxxx和分配给该客户端的fd进行提取,并将它们分别存储到结点的id和fd当中以便将fd和id建立映射关系,并对结点中的heartbeat_lost_count初始化为0,并将该结点添加到链表尾巴当中,至此,客户端完成了与服务器连接并且上线的操作,那么动态链表的结构和长度将发生变化(如图6,图7所示)。如果有新的客户端发起上线操作,将重复刚才的流程,并在链表的结尾添加新的结点。那么通过计算链表的长度(除了头结点)就可以获得当前在线客户端的人数。
可以理解,通过上述操作后,动态链表的结构和长度将发生变化,请参阅如图9及图10,分别表示当前在线的客户端动态链表(数量为2)及有新的客户端上线后的动态链表(数量为3)。
实施例4-已经建立TCP连接的客户端有心跳包命令传输的事件
请参阅图11,为本申请提供的已经建立TCP连接的客户端有心跳包命令传输的事件流程图,包括下述步骤:
步骤S41:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
步骤S42:根据fd调用read函数;
步骤S43:判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
步骤S44:判断数据包是否为HEART;xxxxxxxxxxx;@的格式,其中,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
步骤S45:根据客户端的ID查找客户端所在的动态链表中的结点位置;
步骤S46:将查到的和该客户端对应结点中的heartbeat_lost_count清零。
可以理解,客户端上线后,需要周期性的给服务器发送固定格式和长度的数据,也就是心跳包。格式为:HEART;xxxxxxxxxxx;@,其中HEART为心跳包命令同步头,xxxxxxxxxxx为客户端的ID号。如图11所示,服务器每收到HEART;xxxxxxxxxxx;@后,立刻给客户端返回xxxxxxxxxxx(也就是客户端的ID号),然后根据客户端的ID号查找该客户端所在链表当中的结点位置并将heartbeat_lost_count清零,在发心跳包之前务必先发上线命令:HEL;xxxxxxxxxxx;@,否则服务器会返回错误信息:"sendheartbeart fail!,the client(ID:xxxxxxxxxxx;)is off line,please send HEL command first\n"。
实施例5-心跳包监测的定时器中断服务事件
请参阅图12,为本申请提供的心跳包监测的定时器中断服务事件流程图,包括下述步骤:
步骤S51:判断当前遍历到的结点地址是否等于NULL;若是进下一步;
步骤S52:给所述动态链表中当前遍历到结点的heartbeat_lost_count按1步进递增;
步骤S53:判断heartbeat_lost_count是否大于5,若是,进行下一步;若否,遍历下一个结点;
步骤S54:判定为超时未发送心跳包,根据客户端的fd查找结点所在位置并将结点从动态链表中删除;
步骤S55:遍历下一个结点,并返回第一步。
可以理解,服务器进行初始化后,会启动一个定时器中断服务函数,如图8所示,等时间间隔触发一次。在定时器中断服务函数中,对链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,然后对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,那么服务器认为该客户端丢失心跳包的时间大于预设值(流程图中设为5),服务器将根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,那么动态链表的结构和长度将发生变化(请参考图9,图10的说明)。并给客户端返回"connection time out!,please online again\r\n"的错误信息,然后断开与该客户端的TCP连接从而强制让其下线,此时统计的在线客户端数量也会减少,从而统计的在线客户端的数量更加的准确。
正常情况下,因为服务器会按照客户端发心跳包的频率给客户端回应心跳包(也就是客户端的ID号),并将heartbeat_lost_count清零,因此定时器中断服务函数中的heartbeat_lost_count是不会超过预设值的,只有因为网络原因服务器接收不到客户端的心跳包命令从而不能及时给heartbeat_lost_count清零,导致在定时器中断服务函数中不断的对heartbeat_lost_count递增才会超过预设值。
请参阅图13及14,为本发明通过TCP/IP压力测试工具及模拟客户端的TCP/IP调试工具来测试服务器的客户端连接数和数据吞吐性能,目前已经开发了基于Android系统的客户端以及基于epoll通信服务器的监控系统,服务器能够按照前面所述流程处理,上线信息显示在前端web网页当中如图15,服务器运行于阿里云端,性能稳定,通信可靠如图16。
结合实施例1、实施例2、实施例3、实施例4及实施例5,可以理解,服务器维护着一个动态链表,链表的长度可弹性缩放,长度取决与当前在线(登陆)的客户端数量,每一个结点代表着一个客户端,一旦有新的客户端发起TCP连接请求并发送了上线命令,就将其信息填充到新的结点并插入原链表的尾部,一旦已经建立TCP连接的客户端发起断开请求(包括主动发起或者异常断开的情况),服务器就将其从链表结构当中剔除掉。由于链表的结点是根据需要动态开辟的,因此相比需要实现定义固定长度的数组结构而言,极大的提高内存使用效率,由于是通过指针域操作链表的结点,因此访问效率极高。满足了服务器对于海量客户端并发连接和并发通信的高速要求。
可以理解,客户端每次上线系统分配的fd都是随机的,具有不确定性,但是在系统中每一个客户端的ID都是固定的,本系统通过上线命令和心态包命令,结合动态链表的建立和操作,可以完美的将fd和用户的ID动态绑定起来,无论客户端在什么终端登录,服务器都能够识别。
本发明提供的基于TCP/IP通信协议的在线客户端数量的统计系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明提供的技术方案利用epoll服务器通信模型,提出了通过动态链表的方式统计在线客户端的数量;本发明还提出了增强统计准确性的机制,给每一个客户端提供有条不紊的心跳包控制机制,实时监测和处理异常断开的客户端,从而增强在线客户端数量统计方法的稳定性可靠性以及准确性。
当然本发明的基于TCP/IP通信协议的在线客户端数量的统计系统及方法还可具有多种变换及改型,并不局限于上述实施方式的具体结构。总之,本发明的保护范围应包括那些对于本领域普通技术人员来说显而易见的变换或替代以及改型。
Claims (10)
1.一种基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
2.根据权利要求1所述的基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量。
3.根据权利要求1所述的基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。
4.一种基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,包括下述步骤:
步骤S110:对所述服务器Socket通信参数进行初始化;
步骤S120:所述服务器建立并监听socket套接字描述符socket_fd;
步骤S130:对所述服务器的模型epoll进行初始化;
步骤S140:所述服务器创建动态链表并启动控制心跳包的系统定时器;
步骤S150:所述服务器调用epoll_wait函数,并判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,所述服务器遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
5.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为新的客户端发起TCP连接请求命令,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;
根据socket_fd调用accept函数返回新的socket套接字描述符,记为fd;
将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中。
6.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立连接的客户端断开TCP连接的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否等于0,若是,进行下一步;若否,进行其他事务处理;
根据发起断开请求的客户端的fd查找结点所在位置,并将结点从所述动态链表中删除。
7.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有上线命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEL;xxxxxxxxxxx;@的格式,其中,HEL是hello的缩写,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
对所述xxxxxxxxxxx和分配该客户端的fd进行提取,以开辟新结点,并将所述xxxxxxxxxxx和fd分别存储到新结点的id和fd中,且将heartbeat_lost_count初始化为0;
将所述新节点添加到所述动态链表的结尾。
8.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有心跳包命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEART;xxxxxxxxxxx;@的格式,其中,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
根据客户端的ID查找客户端所在的动态链表中的结点位置;
将查到的和该客户端对应结点中的heartbeat_lost_count清零。
9.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为心跳包监测的定时器中断服务事件,具体包括下述步骤:
判断当前遍历到的结点地址是否等于NULL;若是进下一步;
给所述动态链表中当前遍历到结点的heartbeat_lost_count按1步进递增;
判断heartbeat_lost_count是否大于5,若是,进行下一步;若否,遍历下一个结点;
判定为超时未发送心跳包,根据客户端的fd查找结点所在位置并将结点从动态链表中删除;
遍历下一个结点,并返回第一步。
10.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610812469.4A CN106506253B (zh) | 2016-09-08 | 2016-09-08 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610812469.4A CN106506253B (zh) | 2016-09-08 | 2016-09-08 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106506253A true CN106506253A (zh) | 2017-03-15 |
CN106506253B CN106506253B (zh) | 2020-04-14 |
Family
ID=58291352
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610812469.4A Active CN106506253B (zh) | 2016-09-08 | 2016-09-08 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106506253B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107830039A (zh) * | 2017-11-01 | 2018-03-23 | 国网江苏省电力公司南通供电公司 | 降低瓷瓶螺母松动率的方法 |
CN107948303A (zh) * | 2017-12-08 | 2018-04-20 | 北京酷我科技有限公司 | 一种Android上http请求失败的处理方法 |
CN109697126A (zh) * | 2018-12-29 | 2019-04-30 | 网易(杭州)网络有限公司 | 一种针对服务器的数据处理方法和装置 |
CN111182464A (zh) * | 2019-11-28 | 2020-05-19 | 贵阳朗玛信息技术股份有限公司 | 一种在线采样的方法及装置 |
CN111586040A (zh) * | 2020-05-06 | 2020-08-25 | 北京中科海讯数字科技股份有限公司 | 高性能网络数据接收方法及其系统 |
CN112346792A (zh) * | 2020-06-11 | 2021-02-09 | 广州锦行网络科技有限公司 | 一种基于Linux系统的端口复用方法 |
CN112541023A (zh) * | 2020-12-29 | 2021-03-23 | 深圳市即构科技有限公司 | 在线人数统计方法、电子装置及存储介质 |
CN112954413A (zh) * | 2021-02-02 | 2021-06-11 | 深圳市欢太科技有限公司 | 一种直播列表更新方法、装置、服务器及存储介质 |
CN117118876A (zh) * | 2023-10-20 | 2023-11-24 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101436965A (zh) * | 2008-11-29 | 2009-05-20 | 成都市华为赛门铁克科技有限公司 | 一种共享接入客户端数量的检测方法、装置以及系统 |
CN102647314A (zh) * | 2012-05-16 | 2012-08-22 | 深圳市乐唯科技开发有限公司 | 一种客户端在线状态判定方法及其系统 |
US20150156183A1 (en) * | 2013-12-03 | 2015-06-04 | GateSecure S.A. | System and method for filtering network communications |
CN106254179A (zh) * | 2016-08-05 | 2016-12-21 | 深圳先进技术研究院 | 一种心跳包异步控制方法及装置 |
-
2016
- 2016-09-08 CN CN201610812469.4A patent/CN106506253B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101436965A (zh) * | 2008-11-29 | 2009-05-20 | 成都市华为赛门铁克科技有限公司 | 一种共享接入客户端数量的检测方法、装置以及系统 |
CN102647314A (zh) * | 2012-05-16 | 2012-08-22 | 深圳市乐唯科技开发有限公司 | 一种客户端在线状态判定方法及其系统 |
US20150156183A1 (en) * | 2013-12-03 | 2015-06-04 | GateSecure S.A. | System and method for filtering network communications |
CN106254179A (zh) * | 2016-08-05 | 2016-12-21 | 深圳先进技术研究院 | 一种心跳包异步控制方法及装置 |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107830039A (zh) * | 2017-11-01 | 2018-03-23 | 国网江苏省电力公司南通供电公司 | 降低瓷瓶螺母松动率的方法 |
CN107948303B (zh) * | 2017-12-08 | 2021-06-04 | 北京酷我科技有限公司 | 一种Android上http请求失败的处理方法 |
CN107948303A (zh) * | 2017-12-08 | 2018-04-20 | 北京酷我科技有限公司 | 一种Android上http请求失败的处理方法 |
CN109697126A (zh) * | 2018-12-29 | 2019-04-30 | 网易(杭州)网络有限公司 | 一种针对服务器的数据处理方法和装置 |
CN111182464A (zh) * | 2019-11-28 | 2020-05-19 | 贵阳朗玛信息技术股份有限公司 | 一种在线采样的方法及装置 |
CN111182464B (zh) * | 2019-11-28 | 2024-01-26 | 贵阳朗玛信息技术股份有限公司 | 一种在线采样的方法及装置 |
CN111586040A (zh) * | 2020-05-06 | 2020-08-25 | 北京中科海讯数字科技股份有限公司 | 高性能网络数据接收方法及其系统 |
CN112346792B (zh) * | 2020-06-11 | 2021-09-21 | 广州锦行网络科技有限公司 | 一种基于Linux系统的端口复用方法 |
CN112346792A (zh) * | 2020-06-11 | 2021-02-09 | 广州锦行网络科技有限公司 | 一种基于Linux系统的端口复用方法 |
CN112541023A (zh) * | 2020-12-29 | 2021-03-23 | 深圳市即构科技有限公司 | 在线人数统计方法、电子装置及存储介质 |
CN112954413A (zh) * | 2021-02-02 | 2021-06-11 | 深圳市欢太科技有限公司 | 一种直播列表更新方法、装置、服务器及存储介质 |
CN112954413B (zh) * | 2021-02-02 | 2024-01-16 | 深圳市欢太科技有限公司 | 一种直播列表更新方法、装置、服务器及存储介质 |
CN117118876A (zh) * | 2023-10-20 | 2023-11-24 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
CN117118876B (zh) * | 2023-10-20 | 2024-03-08 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106506253B (zh) | 2020-04-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106506253A (zh) | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 | |
CN106254179B (zh) | 一种心跳包异步控制方法及装置 | |
Gokhale et al. | Evaluating CORBA latency and scalability over high-speed ATM networks | |
CN102880475B (zh) | 计算机软件系统中基于云计算的实时事件处理系统及方法 | |
KR100295003B1 (ko) | 데이타캐싱방법및장치 | |
CN101217429B (zh) | 基于tcp时间戳选项确定tcp报文之间的引发关系的方法 | |
US8291066B2 (en) | Method and system for transaction monitoring in a communication network | |
WO2021056793A1 (zh) | 一种输电线路分布式故障诊断系统及方法 | |
CN109669795A (zh) | 崩溃信息处理方法及装置 | |
CN108287905A (zh) | 一种网络流特征的提取与存储方法 | |
CN106201794A (zh) | 一种服务器的检测方法和装置 | |
CN106559498A (zh) | 风控数据收集平台及其收集方法 | |
CN109302340A (zh) | 一种埋点数据上报方法、装置及计算机可读存储介质 | |
CN111030999B (zh) | 一种基于网络数据包提取文件的方法 | |
WO2009038384A1 (en) | Query processing system and methods for a database with packet information by dividing a table and query | |
CN106375324A (zh) | 一种基于tcp/ip通信协议的网络通信系统及方法 | |
CN104022907A (zh) | 一种校园网的故障侦测系统与方法 | |
CN102098291B (zh) | 一种基于fpga的网络安全日志处理方法和装置 | |
Paxson | Measurements and Models of Wide Area TCP Conversions | |
CN108322343A (zh) | 基于分布式SNMP的Web监控装置及方法 | |
Ghandeharizadeh et al. | Performance of networked xml-driven co-operative applications | |
CN114598622B (zh) | 数据监控方法及装置、存储介质、计算机设备 | |
CN113453179B (zh) | 一种基于5g会话到话单消息的智能转换方法 | |
Cui et al. | On the relationship between QoS and QoE for web sessions | |
US11016807B2 (en) | Intermediary system for data streams |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |