一种基于TCP长连接的服务实现方法和装置与流程

文档序号:16481985发布日期:2019-01-04 22:45阅读:183来源:国知局
一种基于TCP长连接的服务实现方法和装置与流程

本发明涉及通信领域,特别是涉及一种基于TCP长连接的服务实现方法和装置。



背景技术:

当网络通信时采用传输控制协议(Transmission Control Protocol,TCP)时,客户端向服务器发起连接,服务器接受客户端的连接。客户端与服务器完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

TCP的保活功能主要为服务器应用提供,服务器应用希望知道客户端是否崩溃。如果客户端已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将永远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户端发一个探测报文段,客户端处于以下4个状态之一:

客户端依然正常运行,并从服务器可达。客户端的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。

客户端已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户端的TCP都没有响应。如果服务器没有收到一个响应,服务器认为客户端已经关闭并终止连接。

客户端崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。

客户端正常运行,但是服务器不可达,TCP发现没有收到探查的响应。

TCP长连接编程难度相对较大。具体为:程序需要维护连接状态,需要额外编程,异常不好管控;TCP长连接并发对编程有较高难度,普通实现方案通过创建实现多进程并发,当调用业务服务出现堵塞时,会导致系统资源被耗光,从而整个服务器不可用,可靠性不高;TCP长连接协议各不相同,较难做到一个通用技术方案,做到程序高度可复用,业务高度可配置。



技术实现要素:

本发明所要解决的技术问题是提供一种基于TCP长连接的服务实现方法和装置。

本发明解决上述技术问题的技术方案如下:一种基于TCP长连接的服务实现方法,包括:

步骤S1,主进程从配置文件中获取监听端口,通过绑定方法绑定主机网络协议IP和所述监听端口,并建立监听;

步骤S2,所述主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值;

步骤S3,如果所述连接请求数在所述预设的连接数阈值范围内,则所述主进程创建通讯子进程,并对所述通讯子进程进行初始化;

步骤S4,通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程。

本发明的有益效果是:在TCP长连接的情况下,通过异步的通讯模型可以提高服务端的呑吐量;利用轮询方式,将连接与通讯模块分离,利用管道通讯,实现通讯与业务处理分离,通讯层面协议调整和后端业务逻辑调整互不影响,高度可复用,扩展性强。

在上述技术方案的基础上,本发明还可以做如下改进。

进一步,所述步骤S3包括:

步骤S31,创建子进程管理区共享内存块、通讯管道数组和所述业务子进程,其中,所述通讯管道数组包括业务请求通讯管道和业务应答通讯管道;

步骤S32,将所述业务子进程的信息、所述业务子进程的编号、管道信息和所述业务子进程的状态写入所述子进程管理区共享内存块;

步骤S33,调用系统函数启动所述业务子进程,并将套接字标识符ID、管道编号作为入参传入所述业务子进程。

进一步,所述步骤S4包括,重复执行步骤S41至步骤S47:

步骤S41,将所述通讯子进程加入超时信号处理函数;

步骤S42,初始化文件描述符集合,将所述套接字ID加入所述文件描述符集合;

步骤S43,遍历所述子进程管理区共享内存块,并判断所述业务子进程的运行状态;

步骤S44,如果所述业务子进程的运行状态为忙碌状态,则将所述业务应答通讯管道加入所述文件描述符集合;

步骤S45,通过异步轮询函数遍历所述文件描述符集合,并检测所述文件描述符集合的状态变化;

步骤S46,如果所述套接字ID发生变化,则所述通讯子进程调用套接字接收函数接收请求报文,并判断所述请求报文的报文类型;

步骤S47,如果所述业务应答通讯管道发生变化,则所述通讯子进程调用所述套接字接收函数接收所述业务应答通讯管道的应答内容,并将所述应答内容通过写函数返回给所述客户端。

进一步,所述步骤S46包括:

步骤S461,如果所述报文类型为访问控制类型,则所述通讯子进程根据所述访问控制类型调用不同的处理函数;

步骤S462,如果所述报文类型为业务报文类型,则所述通讯子进程将业务请求通过业务请求通讯管道写入业务子进程通讯管道,以使得所述业务子进程进行业务逻辑处理。

进一步,所述步骤S462包括,重复执行步骤S4622至步骤S4628:

步骤S4621,建立共享内存,将业务报文模板加载到所述共享内存中;

步骤S4622,监听所述业务子进程中业务请求通讯管道的变化;

步骤S4623,如果所述业务请求通讯管道发生变化,则读取所述业务请求通讯管道的数据;

步骤S4624,如果读取超时,则修改所述子进程管理区共享内存块,将所述业务子进程的运行状态设置为忙碌状态;

步骤S4625,根据业务关键字匹配所述业务报文模板得到业务报文字段,将所述业务报文字段构成键值对;

步骤S4626,调用业务处理进程获取业务处理结果信息;

步骤S4627,将所述业务处理结果信息写入所述业务应答通讯管道;

步骤S4628,修改所述子进程管理区共享内存块,并将所述业务子进程的运行状态设置为空闲状态。

本发明解决上述技术问题的技术方案如下:一种基于TCP长连接的服务实现装置,包括:

监听端口获取单元,用于主进程从配置文件中获取监听端口,通过绑定方法绑定主机网络协议IP和所述监听端口,并建立监听;

连接请求接收单元,用于所述主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值;

通讯子进程创建单元,用于所述连接请求数在所述预设的连接数阈值范围内,所述主进程创建通讯子进程,并对所述通讯子进程进行初始化;

异步调度单元,用于通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程。

本发明的有益效果是:在TCP长连接的情况下,通过异步的通讯模型可以提高服务端的呑吐量;利用轮询方式,将连接与通讯模块分离,利用管道通讯,实现通讯与业务处理分离,通讯层面协议调整和后端业务逻辑调整互不影响,高度可复用,扩展性强。

在上述技术方案的基础上,本发明还可以做如下改进。

进一步,所述通讯子进程创建单元包括:

创建单元,用于创建子进程管理区共享内存块、通讯管道数组和所述业务子进程,其中,所述通讯管道数组包括业务请求通讯管道和业务应答通讯管道;

写入单元,用于将所述业务子进程的信息、所述业务子进程的编号、管道信息和所述业务子进程的状态写入所述子进程管理区共享内存块;

启动单元,用于调用系统函数启动所述业务子进程,并将套接字标识符ID、管道编号作为入参传入所述业务子进程。

进一步,所述异步调度单元包括:

通讯子进程加入单元,用于将所述通讯子进程加入超时信号处理函数;

套接字加入单元,用于初始化文件描述符集合,将所述套接字ID加入所述文件描述符集合;

业务子进程判断单元,用于遍历所述子进程管理区共享内存块,并判断所述业务子进程的运行状态;

业务应答通讯管道加入单元,用于在所述业务子进程的运行状态为忙碌状态的情况下,将所述业务应答通讯管道加入所述文件描述符集合;

检测单元,用于通过异步轮询函数遍历所述文件描述符集合,并检测所述文件描述符集合的状态变化;

报文类型判断单元,用于在所述套接字ID发生变化的情况下,所述通讯子进程调用套接字接收函数接收请求报文,并判断所述请求报文的报文类型;

调用单元,用于在所述业务应答通讯管道发生变化的情况下,所述通讯子进程调用所述套接字接收函数接收所述业务应答通讯管道的应答内容,并将所述应答内容通过写函数返回给所述客户端。

进一步,所述报文类型判断单元包括:

不同处理函数调用单元,用于在所述报文类型为访问控制类型的情况下,所述通讯子进程根据所述访问控制类型调用不同的处理函数;

业务逻辑处理单元,用于在所述报文类型为业务报文类型的情况下,所述通讯子进程将业务请求通过业务请求通讯管道写入业务子进程通讯管道,以使得所述业务子进程进行业务逻辑处理。

进一步,所述业务逻辑处理单元包括:

建立共享内存,将业务报文模板加载到所述共享内存中;

监听所述业务子进程中业务请求通讯管道的变化;

如果所述业务请求通讯管道发生变化,则读取所述业务请求通讯管道的数据;

如果读取超时,则修改所述子进程管理区共享内存块,将所述业务子进程的运行状态设置为忙碌状态;

根据业务关键字匹配所述业务报文模板得到业务报文字段,将所述业务报文字段构成键值对;

调用业务处理进程获取业务处理结果信息;

将所述业务处理结果信息写入所述业务应答通讯管道;

修改所述子进程管理区共享内存块,并将所述业务子进程的运行状态设置为空闲状态。

附图说明

图1为本发明实施例提供的一种基于TCP长连接的服务实现方法流程图;

图2为本发明实施例提供的一种基于TCP长连接的服务实现装置示意图;

图3为本发明实施例提供的进程模型示意图。

附图中,各标号所代表的部件列表如下:

10、监听端口获取单元,20、连接请求接收单元,30、通讯子进程创建单元,40、异步调度单元。

具体实施方式

以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。

图1为本发明实施例提供的一种基于TCP长连接的服务实现方法流程图。

参照图1,步骤S1,主进程从配置文件中获取监听端口,通过绑定方法绑定主机网络协议IP和所述监听端口,并建立监听。

步骤S2,所述主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值。

步骤S3,如果所述连接请求数在所述预设的连接数阈值范围内,则所述主进程创建通讯子进程,并对所述通讯子进程进行初始化。

这里,同时给连接请求计数器加1。如果所述连接请求数超过所述预设的连接数阈值,则主进程拒绝所述客户端的新的连接访问,从而可以控制服务端的并发访问,防止系统连接资源被占满而导致异常。

步骤S4,通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程。

在本实施例中,作为对图1所示实现方式的细化,所述步骤S3包括:

步骤S31,创建子进程管理区共享内存块、通讯管道数组和所述业务子进程,其中,所述通讯管道数组包括业务请求通讯管道和业务应答通讯管道;

步骤S32,将所述业务子进程的信息、所述业务子进程的编号、管道信息和所述业务子进程的状态写入所述子进程管理区共享内存块;

步骤S33,调用系统函数启动所述业务子进程,并将套接字标识符ID、管道编号作为入参传入所述业务子进程。

在本实施例中,作为对图1所示实现方式的细化,所述步骤S4包括,重复执行步骤S41至步骤S47:

步骤S41,将所述通讯子进程加入超时信号处理函数;

步骤S42,初始化文件描述符集合,将所述套接字ID加入所述文件描述符集合;

步骤S43,遍历所述子进程管理区共享内存块,并判断所述业务子进程的运行状态;

步骤S44,如果所述业务子进程的运行状态为忙碌状态,则将所述业务应答通讯管道加入所述文件描述符集合;

步骤S45,通过异步轮询函数遍历所述文件描述符集合,并检测所述文件描述符集合的状态变化;

步骤S46,如果所述套接字ID发生变化,则所述通讯子进程调用套接字接收函数接收请求报文,并判断所述请求报文的报文类型。

步骤S47,如果所述业务应答通讯管道发生变化,则表示业务子进程已处理完业务,所述通讯子进程调用所述套接字接收函数接收所述业务应答通讯管道的应答内容,并将所述应答内容通过写函数返回给所述客户端,此时,一个业务请求处理完成。

在本实施例中,作为对步骤S46所示实现方式的细化,所述步骤S46包括:

步骤S461,如果所述报文类型为访问控制类型,则所述通讯子进程根据所述访问控制类型调用不同的处理函数。

这里,如果所述报文类型为访问控制类型,则所述通讯子进程根据所述访问控制类型调用不同处理函数,如果是登录请求,调用登录处理函数,验证访问是否合法。

如果访问合法,则建立连接会话,返回会话ID。如果是登录退出请求,则调用登录退出处理函数,此时,连接请求数计数器-1,之后给客户端返回退出成功。

步骤S462,如果所述报文类型为业务报文类型,则所述通讯子进程将业务请求通过业务请求通讯管道写入业务子进程通讯管道,以使得所述业务子进程进行业务逻辑处理。

在本实施例中,作为对步骤S462所示实现方式的细化,所述步骤S462包括,重复执行步骤S4622至步骤S4628:

步骤S4621,建立共享内存,将业务报文模板加载到所述共享内存中;

这里,共享内存中存入两类数据,一是路由数据,二是业务解析规则数据。路由数据用于根据业务服务的请求参数调用不同服务;业务解析规则数据用于解析业务请求报文,即为报文解析模板。

具体地,路由数据为Key1value1和Key2value2,其中,Key1、Key2为路由关键字;value1、value2为路由值,即目标数据。

业务解析规则配置数据为:

BUSADDR=10.10.10.10

REQBODYINFO=xxxxxx

RSPBODYINFO=yyyyyy

REQBUSINFO=zzzzzz

REQBUSINFO=wwwwww

其中,xxxxxx和yyyyyy请求报文和应答报文的解析规则,即为报文解析模板。

步骤S4622,监听所述业务子进程中业务请求通讯管道的变化;

步骤S4623,如果所述业务请求通讯管道发生变化,则读取所述业务请求通讯管道的数据;

步骤S4624,如果读取超时,则修改所述子进程管理区共享内存块,将所述业务子进程的运行状态设置为忙碌状态;

步骤S4625,根据业务关键字匹配所述业务报文模板得到业务报文字段,将所述业务报文字段构成键值对;

步骤S4626,调用业务处理进程获取业务处理结果信息;

步骤S4627,将所述业务处理结果信息写入所述业务应答通讯管道;

步骤S4628,修改所述子进程管理区共享内存块,并将所述业务子进程的运行状态设置为空闲状态。

这里,通讯子进程管理的结构体定义如下:

在主进程中定义CHILD*cptr;在通讯子进程中创建cptr为共享内存memset((CHILD*)cptr,0,sizeof(CHILD)*max_proc);,供已建立连接的通讯子进程使用。

本实施例提供的一种基于TCP长连接的服务实现方法,主进程从配置文件中获取监听端口,主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值;如果所述连接请求数在所述预设的连接数阈值范围内,则所述主进程创建通讯子进程,并对所述通讯子进程进行初始化;通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程,从而在少量连接数情况下,即可以达到上万并发量,提高服务端的呑吐量;利用轮询方式,将连接与通讯模块分离,利用管道通讯,实现通讯与业务处理分离,通讯层面协议调整和后端业务逻辑调整互不影响,高度可复用,扩展性强。

图2为本发明实施例提供的一种基于TCP长连接的服务实现装置示意图。

参照图2,TCP长连接的服务实现装置包括监听端口获取单元10、连接请求接收单元20、通讯子进程创建单元30和异步调度单元40。

监听端口获取单元10,用于主进程从配置文件中获取监听端口,通过绑定方法绑定主机网络协议IP和所述监听端口,并建立监听;

连接请求接收单元20,用于所述主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值;

通讯子进程创建单元30,用于所述连接请求数在所述预设的连接数阈值范围内,所述主进程创建通讯子进程,并对所述通讯子进程进行初始化;

异步调度单元40,用于通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程。

在本实施例中,所述通讯子进程创建单元30包括:

创建单元(未示出),用于创建子进程管理区共享内存块、通讯管道数组和所述业务子进程,其中,所述通讯管道数组包括业务请求通讯管道和业务应答通讯管道;

写入单元(未示出),用于将所述业务子进程的信息、所述业务子进程的编号、管道信息和所述业务子进程的状态写入所述子进程管理区共享内存块;

启动单元(未示出),用于调用系统函数启动所述业务子进程,并将套接字标识符ID、管道编号作为入参传入所述业务子进程。

在本实施例中,所述异步调度单元40包括:

通讯子进程加入单元(未示出),用于将所述通讯子进程加入超时信号处理函数;

套接字加入单元(未示出),用于初始化文件描述符集合,将所述套接字ID加入所述文件描述符集合;

业务子进程判断单元(未示出),用于遍历所述子进程管理区共享内存块,并判断所述业务子进程的运行状态;

业务应答通讯管道加入单元(未示出),用于在所述业务子进程的运行状态为忙碌状态的情况下,将所述业务应答通讯管道加入所述文件描述符集合;

检测单元(未示出),用于通过异步轮询函数遍历所述文件描述符集合,并检测所述文件描述符集合的状态变化;

报文类型判断单元(未示出),用于在所述套接字ID发生变化的情况下,所述通讯子进程调用套接字接收函数接收请求报文,并判断所述请求报文的报文类型。

调用单元(未示出),用于在所述业务应答通讯管道发生变化的情况下,所述通讯子进程调用所述套接字接收函数接收所述业务应答通讯管道的应答内容,并将所述应答内容通过写函数返回给所述客户端。

在本实施例中,所述报文类型判断单元包括:

不同处理函数调用单元(未示出),用于在所述报文类型为访问控制类型的情况下,所述通讯子进程根据所述访问控制类型调用不同的处理函数;

业务逻辑处理单元(未示出),用于在所述报文类型为业务报文类型的情况下,所述通讯子进程将业务请求通过业务请求通讯管道写入业务子进程通讯管道,以使得所述业务子进程进行业务逻辑处理。

在本实施例中,所述业务逻辑处理单元包括:

建立共享内存,将业务报文模板加载到所述共享内存中;

监听所述业务子进程中业务请求通讯管道的变化;

如果所述业务请求通讯管道发生变化,则读取所述业务请求通讯管道的数据;

如果读取超时,则修改所述子进程管理区共享内存块,将所述业务子进程的运行状态设置为忙碌状态;

根据业务关键字匹配所述业务报文模板得到业务报文字段,将所述业务报文字段构成键值对;

调用业务处理进程获取业务处理结果信息;

将所述业务处理结果信息写入所述业务应答通讯管道;

修改所述子进程管理区共享内存块,并将所述业务子进程的运行状态设置为空闲状态。

本实施例提供的一种基于TCP长连接的服务实现装置,主进程从配置文件中获取监听端口,主进程接收客户端发送的连接请求,并判断连接请求数是否超过预设的连接数阈值;如果所述连接请求数在所述预设的连接数阈值范围内,则所述主进程创建通讯子进程,并对所述通讯子进程进行初始化;通过异步轮询机制处理文件描述符集合,并通过通讯管道数组异步调度业务子进程,从而在少量连接数情况下,即可以达到上万并发量,提高服务端的呑吐量;利用轮询方式,将连接与通讯模块分离,利用管道通讯,实现通讯与业务处理分离,通讯层面协议调整和后端业务逻辑调整互不影响,高度可复用,扩展性强。

图3为本发明实施例提供的进程模型示意图。

参照图3,对于每一个客户端发送的连接请求,主进程创建通讯子进程,通讯子进程接收客户端发送的报文数据,并判断报文数据的报文类型,如果报文类型为访问类型,则向所述客户端回复相应的响应信息;如果报文类型为业务数据,则通过系统调用业务处理进程,业务子进程与业务处理进程通过管道交互,即异步处理。

通过进程模型,将传输控制协议(Transmission Control Protocol,TCP)长连接请求进行分类处理,处理策略不同。如果报文类型为访问类型,由于请求频率低,由通讯子进程直接处理,不影响性能;如果报文类型为业务数据,由于请求量大,由业务子进程异步调用业务处理进程进行处理,大大提升处理效率。

将业务处理进程与主进程、通讯子进程、业务子进程分离,可以使主进程与业务无关,针对不同TCP长连接,开发定制协议适配器即可,无需对主进程进行改动,从而保持高度复用和稳定性。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1