首页> 中国专利> 一种基于TCP/IP通信协议的网络通信系统及方法

一种基于TCP/IP通信协议的网络通信系统及方法

摘要

本发明提供的基于TCP/IP通信协议的网络通信系统,包括:服务器及与至少一客户端,服务器用于创建动态链表,动态链表包括一头结点和若干子结点,以头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,服务器通过调用epoll_wait函数,判断客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明利用epoll服务器通信模型,提出了通过动态链表的方式实现客户端上线、下线、客户端与服务器,客户端与客户端之间通信,解决了一般服务器不能满足大规模用户连接的缺陷并利用计算机硬件资源提高了服务器的内存使用率。

著录项

  • 公开/公告号CN106375324A

    专利类型发明专利

  • 公开/公告日2017-02-01

    原文格式PDF

  • 申请/专利权人 深圳先进技术研究院;

    申请/专利号CN201610812431.7

  • 发明设计人 宁运琨;赵国如;李慧奇;梁升云;

    申请日2016-09-08

  • 分类号H04L29/06(20060101);

  • 代理机构深圳市科进知识产权代理事务所(普通合伙);

  • 代理人赵勍毅

  • 地址 518055 广东省深圳市南山区西丽大学城学苑大道1068号

  • 入库时间 2023-06-19 01:25:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-02-14

    授权

    授权

  • 2017-03-01

    实质审查的生效 IPC(主分类):H04L29/06 申请日:20160908

    实质审查的生效

  • 2017-02-01

    公开

    公开

说明书

技术领域

本发明涉及网络通信技术领域,尤其是涉及一种基于TCP/IP通信协议的网络通信系统及方法。

背景技术

基于智能手机APP或者其他带操作系统的便捷式移动设备的移动远程监测越来越普及,比如用智能手机对被监护人进行远程定位和运动和生理数据监测,通过智能手机对家用电器远程操控等。针对服务器而言,无论是充当监护端的智能手机APP还是提供数据来源的各种穿戴式和专业设备,它们都是客户端,要解决特定监护对象对特定被监护对象之间互相传输数据的问题其实就是要解决服务器系统里面的任意客户端之间通信的问题。目前大部分客户端与服务器之间的通信主要是采用多线程或者多进程的方式,用不同的线程处理不同的客户端通信。而客户端与客户端之间通信是通过服务器来转发。比如客户端A与客户端B通信,首先是客户端A与服务器通信,服务器再将A的消息转发给客户端B。

目前大部分的能够实现客户端之间互相通信的服务器都是用java或者c#编写,大部分运行在window系统下,对于客户端数量不多,数据吞吐量要求不高的场合,可以采用此方式,但是window本身是一个比较耗系统资源(比如内存开销比较大)的操作系统,对于商业应用而言还需要支付一定的版权费用,在此操作系统上,简单的多线程多进程方式实现,很难满足海量用户连接和并发通信的要求。

对于管理在线客户端而言,大部分是采用开辟固定的内存单元来保存在线的客户端信息,这种方式不能充分利用内存空间,因为在线客户端的数量是动态变化的,采用此方式容易引起系统错误或者浪费内存空间。

发明内容

有鉴如此,有必要针对现在技术存在的缺陷,提供一种可满足大规模用户连接的缺陷并充分利用计算机硬件资源极大的提高了服务器的内存使用率的网络通信系统及方法。

为实现上述目的,本发明采用下述技术方案:

一种基于TCP/IP通信协议的网络通信系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;

所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发。

其中,所述通信事件包括新的客户端发起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连接请求命令、已经建立连接的客户端发起上线命令、客户端之间的通信请求及客户端的下线请求。

在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为新的客户端发起TCP连接请求命令,具体包括下述步骤:

epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;

根据socket_fd调用accept函数返回新的socket套接字描述符,记为fd;

将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中。

在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立连接的客户端发起上线命令,具体包括下述步骤:

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中,所述服务器遍历并处理所述通信事件,当所述通信事件为客户端之间的通信请求,具体包括下述步骤:

epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;

根据fd调用read函数;

判断read返回值是否大于0,若是,进行下一步;若否,进行其他处理;

判断数据包是否为DATA;ID_send;ID_rec;content;@的格式,其中,其中ID_send表示发送方的ID号,记为客户端Ⅰ的ID,ID_rec表示接收方的ID号,记为客户端Ⅱ的ID,若是,进行下一步;若否,根据协议对其他数据包或者命令进行处理;

提取ID_send,ID_rec,content信息;

通过ID_rec查找所述动态链表,判断ID_rec是否在所述动态链表上,若是,进行下一步;若否,给所述客户端Ⅰ的ID_send发送返回错误代码;

通过ID_rec查找所述动态链表,找出ID_rec对应的fd;

通过ID_rec的fd,调用write函数将content发送给ID_rec。

在一些实施例中,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为客户端的下线请求,具体包括下述步骤:

epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;

根据fd调用read函数;

判断read返回值是否等于0,若是,进行下一步;若否,进行其他处理;

根据发起断开请求的客户端的fd查找结点所在位置,并将所述结点从所述动态链表中删除;

关闭fd。

本发明采用上述技术方案的优点是:

本发明提供的基于TCP/IP通信协议的网络通信系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明提供的技术方案利用epoll服务器通信模型,提出了通过动态链表的方式实现客户端上线、下线、客户端与服务器,客户端与客户端之间通信的协议方法,解决了一般服务器不能满足大规模用户连接的缺陷并充分利用计算机硬件资源极大的提高了服务器的内存使用率,可用于智能家居移动式监测、穿戴式设备位置追踪和运动监测等领域当中。

附图说明

图1为本发明实施例提供的基于TCP/IP通信协议的网络通信系统的结构示意图。

图2为本申请一较佳实施例提供的动态链接的结构示意图。

图3为本申请提供的基于TCP/IP通信协议的网络通信方法的步骤流程图。

图4为本申请提供的新的客户端发起TCP连接请求的事件处理的步骤流程图。

图5为本申请提供的已经建立连接客户端向服务器发上线命令时服务器处理流程图。

图6表示当前在线的客户端链表(数量为2)。

图7表示为有新的客户端上线后的新链表(数量为3)。

图8为本申请提供的上线的客户端互相通信时服务器处理流程图。

图9为多客户端通信示意图。

图10为本申请提供的已经建立连接的客户端断开TCP连接请求时服务器处理流程图。

图11表示已经建立连接的客户端发起断开请求时动态链表示意图。

图12表示为将发起断开请求的客户端从链表中删除并重构链表的结构示意图。

图13为服务器压力测试(模拟)示意图。

图14为在线客户端的远程位置定位和监控示意图。

图15为上线的客户端在前端web页面的显示示意图。

图16为服务器监视界面示意图。

具体实施方式

请参阅图1,本发明实施例提供的一种基于TCP/IP通信协议的网络通信系统,包括:服务器110及与所述服务器110TCP连接的至少一客户端120。

所述服务器110用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next。

优选地,该动态链表的结点数据结构id_fd_node定义如下:

typedef struct id_fd_str

{

char id[13];//存储客户端ID的字符数组

int fd;//存储服务器分配给已经建立连接的客户端的套接字描述符

int heartbeat_lost_count;//心跳包丢失统计相关变量

struct id_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连接请求命令、已经建立连接的客户端发起上线命令、客户端之间的通信请求及客户端的下线请求。

可以理解,对于服务器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、已经建立连接的客户端有数据(命令)传输

3、客户端之间的通信请求

4、客户端的下线请求

以下结合具体实施例分别对上述4种情况进行详细说明。

实施例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-已经建立连接的客户端发起上线命令

请参阅图5,为本申请提供的已经建立连接客户端向服务器发上线命令时服务器处理流程图,包括下述步骤:

S21:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;

S22:根据fd调用read函数;

S23:判断read返回值是否大于0,若是,进行下一步;若否,进行异常处理;

S24:判断数据包是否为HEL;xxxxxxxxxxx;@的格式,其中,HEL是hello的缩写,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,根据协议对其他数据包或者命令进行处理;

S25:对所述xxxxxxxxxxx和分配该客户端的fd进行提取,以开辟新结点,并将所述xxxxxxxxxxx和fd分别存储到新结点的id和fd中,且将heartbeat_lost_count初始化为0;

S26:将所述新节点添加到所述动态链表的结尾。

可以理解,客户端通过获取了fd之后,还需要发上线命令才能完成客户端的上线工作,具体来说,在服务器与客户端之间进行正常的数据收发之前,首先客户端根据服务器端的IP和端口号发起TCP连接请求,服务器监听到有新客户端连接后,在系统中会分配一个fd,接下来客户端还要按照下述格式来给服务器发送上线通知的命令才能算真正的上线,格式如下:HEL;xxxxxxxxxxx;@(HEL是hello的缩写,意思是向服务器打招呼,xxxxxxxxxxx是客户端的ID(手机号),用分号";"隔开,最后以@结束),服务器收到“HEL;xxxxxxxxxxx;@”的命令后,会触发客户端事件2,将会对值为xxxxxxxxxxx的ID号和分配给该客户端的fd进行提取,并将它们分别存储到结点的id和fd当中以便将fd和id建立映射关系并将该结点添加到链表尾巴当中,至此,客户端完成了与服务器连接并且上线的操作。

可以理解,通过上述操作后,动态链表的结构和长度将发生变化,请参阅如图6及图7,分别表示当前在线的客户端链表(数量为2)及有新的客户端上线后的新链表(数量为3)。如果有新的客户端发起上线操作,将重复刚才的流程,并在链表的结尾添加新的结点。

实施例3-客户端之间通信的协议

请参阅图8,为本申请提供的上线的客户端互相通信时服务器处理流程图,包括下述步骤:

S31:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;

S32:根据fd调用read函数;

S33:判断read返回值是否大于0,若是,进行下一步;若否,进行其他处理;

S34:判断数据包是否为DATA;ID_send;ID_rec;content;@的格式,其中,其中ID_send表示发送方的ID号,记为客户端Ⅰ的ID,ID_rec表示接收方的ID号,记为客户端Ⅱ的ID,若是,进行下一步;若否,根据协议对其他数据包或者命令进行处理;

S35:提取ID_send,ID_rec,content信息;

S36:通过ID_rec查找所述动态链表,判断ID_rec是否在所述动态链表上,若是,进行下一步;若否,给所述客户端Ⅰ的ID_send发送返回错误代码;

S37:通过ID_rec查找所述动态链表,找出ID_rec对应的fd;

S38:通过ID_rec的fd,调用write函数将content发送给ID_rec。

请参阅图9,为多客户端通信示意图,当客户端1,要给客户端4发送数据,首先客户端1要向服务器发送DATA;ID_send;ID_rec;content;@,其中ID_send表示发送方的ID号(也就是客户端1的ID),ID_rec表示接收方的ID号(就是客户端4的ID),服务器收到数据包后,判断为“已经建立连接的客户端有数据(命令)传输”的客户端事件,将会退出epoll_wait函数,直接转到如图8所示的流程。

可以理解,服务器根据fd(其实就是图8中的客户端1的fd)调用read接收完数据包后,对ID_send,ID_rec,content进行提取,通过ID_rec查找链表,检测ID_rec是否在线(其实也就是检索ID_rec是否存在于链表的结点当中),如果存在,那么根据ID_rec查找链表中对应的fd,然后通过ID_rec的fd调用write函数将DATA;ID_send;ID_rec;content;@原封不动的发到ID_rec。如果ID_rec不在线,那么服务器会给发送方(ID号为ID_send)返回发送失败的错误信息,至此,服务器完成了客户端1到客户端4的数据中转流程。

客户端4收到数据包后,根据协议对数据包进行解析,就可以知道是由ID为ID_send的客户端发给它,发的内容为content。如果客户端4要给客户端1发送数据,那么跟前面一样,客户端4首先需要给服务器发送数据包DATA;ID_send;ID_rec;content;@,只是客户端4变成了发送方(ID为ID_send),客户端1变成了接收方(ID为ID_rec),发送内容为content。

实施例4-客户端下线的协议

请参阅图10,为本申请提供的已经建立连接的客户端断开TCP连接请求时服务器处理流程图,包括下述步骤:

步骤S41:epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;

步骤S42:根据fd调用read函数;

步骤S43:判断read返回值是否等于0,若是,进行下一步;若否,进行其他处理;

步骤S44:根据发起断开请求的客户端的fd查找结点所在位置,并将所述结点从所述动态链表中删除;

步骤S45:关闭fd。

可以理解,如果已经建立连接的客户端发起断开TCP连接,那么read函数的返回值为0,服务器会根据发起断开请求的客户端的fd查找结点所在链表中的位置并将结点从链表中删除掉。然后将该删除的结点的前后结点通过结点的指针域next连接起来构成新的链表。

请参阅图11及12,分别表示已经建立连接的客户端发起断开请求时动态链表示意图及将发起断开请求的客户端从链表中删除并重构链表的结构示意图,由此可见,该事件会使得在线客户端数量减少,客户端下线后,不能发送信息,也不能接受服务器或者客户端发来的信息。

请参阅图13,为本发明通过TCP/IP压力测试工具来测试服务器的客户端连接数和数据吞吐性能,目前已经开发了基于Android系统的客户端以及基于epoll通信服务器的监控系统,实现了在线客户端的位置定位如图14,服务器能够按照前面所述流程处理,上线信息显示在前端web网页当中如图15,服务器运行于阿里云端,性能稳定,通信可靠如图16。

结合实施例1、实施例2、实施例3及实施例4,可以理解,服务器维护着一个动态链表,链表的长度可弹性缩放,长度取决与当前在线(登陆)的客户端数量,每一个结点代表着一个客户端,一旦有新的客户端发起TCP连接请求并发送了上线命令,就将其信息填充到新的结点并插入原链表的尾部,一旦已经建立TCP连接的客户端发起断开请求(包括主动发起或者异常断开的情况),服务器就将其从链表结构当中剔除掉。由于链表的结点是根据需要动态开辟的,因此相比需要实现定义固定长度的数组结构而言,极大的提高内存使用效率,由于是通过指针域操作链表的结点,因此访问效率极高。满足了服务器对于海量客户端并发连接和并发通信的高速要求。

可以理解,客户端每次上线系统分配的fd都是随机的,具有不确定性,但是在系统中每一个客户端的ID都是固定的,本系统通过上线命令和心态包命令,结合动态链表的建立和操作,可以完美的将fd和用户的ID动态绑定起来,无论客户端在什么终端登录,服务器都能够识别。

本发明提供的基于TCP/IP通信协议的网络通信系统,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发,本发明提供的技术方案利用epoll服务器通信模型,提出了通过动态链表的方式实现客户端上线、下线、客户端与服务器,客户端与客户端之间通信的协议方法,解决了一般服务器不能满足大规模用户连接的缺陷并充分利用计算机硬件资源极大的提高了服务器的内存使用率,可用于智能家居移动式监测、穿戴式设备位置追踪和运动监测等领域当中。

当然本发明的基于TCP/IP通信协议的网络通信系统及方法还可具有多种变换及改型,并不局限于上述实施方式的具体结构。总之,本发明的保护范围应包括那些对于本领域普通技术人员来说显而易见的变换或替代以及改型。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号