一种异步网络通信方法及装置技术领域
本发明涉及网络通信技术,尤其涉及一种异步网络通信方法及装
置。
背景技术
操作系统中,执行一个任务所需要使用的处理器或微控制器的寄
存器等资源,称为任务的上下文。执行任务时,系统会根据需要挂起
或恢复任务,而在这过程中,寄存器等资源可能发生变化,为了保证
一个任务恢复时,其所用的资源与之前该任务处于挂起状态时相同,
需要保存该任务在挂起时的上下文,并在任务恢复时恢复其上下文,
称为上下文的切换。在现有的网络通信技术中,当前端用户的请求线
程越来越多时,通常需要在客户端的后台开启额外的线程来完成异步
通信,造成线程上下文频繁的切换,导致系统性能低下。
而且,在未建立对服务端的保护机制的情况下,当客户端的线程
不断地向服务端发出请求时,容易导致服务端的请求拥塞,从而影响
其他线程向服务端发出请求。
发明内容
本发明的目的是提供一种异步网络通信方法及装置,可以有效
以此降低线程上下文切换的频率,提高系统的性能。
根据本发明,所提供的异步网络通信方法,包括以下步骤:
针对客户端的每次请求,设置一个唯一的标识号;
设置一个等待窗口,将每次请求以相应的标识号为键,注册到等
待窗口中,并将每次请求的函数接口以所述标识号为键,放入等待窗
口;
针对客户端的每次请求,均由服务端返回相应的响应包,并将响
应包的数据以所述标识号为键,存入等待窗口;
解析所返回的响应包,获取其中的标识号,根据所获取的标识号,
将响应包中的数据传到相应的函数接口,由客户端进行相应操作。
根据本发明的另一个方面,还提供了一种异步网络通信装置,包
括以下模块:
标识设置模块,用于针对客户端的每次请求,设置一个唯一的标
识号;
等待窗口模块,用于注册以相应的标识号为键的每次请求和存储
以相应的标识号为键的每次请求的函数接口;
接收响应模块,针对客户端的每次请求而由服务端返回的相应响
应包,将其响应包的数据以所述标识号为键,存入等待窗口;
解析响应模块,用于解析所返回的响应包,获取其中的标识号,
根据所获取的标识号,将响应包中的数据传到相应的函数接口,由客
户端进行相应操作。
与现有技术相比,本发明具有以下优点:
1)可以有效降低线程上下文切换的频率,提高系统的性能;
2)可以显著提高服务端的并发响应能力,降低响应时间;
3)可以有效的进行负载控制提高系统可用性。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描
述,本发明的其它特征、目的和优点将会变得更明显:
图1为根据本发明一个优选实施例的异步网络通信方法流程图;
以及
图2为根据本发明的一个优选实施例的以回调函数和接收
(receive)函数为例的异步网络通信方法流程图。
具体实施方式
下面结合附图对本发明作进一步详细描述。
根据本发明的一个方面,提供了一种异步网络通信方法。需要说
明的是,本实施例中,可视客户端的每次请求为一次线程的处理,下
文将进行详细说明。
请参考图1,图1为根据本发明一个优选实施例的异步网络通信
方法流程图。
如图1所示,本发明所提供的异步网络通信方法包括以下步骤:
步骤S101,针对客户端的每次请求,设置一个唯一的标识号
(SessionID),也称为会话标识。Session(会话)机制是一种标识请
求上下文的机制,客户端使用一种类似于散列表的结构(也可能就是
使用散列表)来保存信息。
客户端每次发起一个新的请求时,都会创建一个唯一标识号
(SessionID),主要用来匹配客户端请求和服务器端的响应,SessionID
存储在等待窗口中。
具体地,客户端的请求包括各种类型,有的请求发送到服务端后,
无需服务端返回数据,如请求将数据添加到数据库,对于这种请求,
不需要在客户端的等待窗口中做相关的注册,客户端封装相应的请求
包发往服务端,服务端在接收到这种类型的请求后直接进行相关的处
理,结果无需返回.有的请求发送到服务端后,需要服务端返回数据,
如请求服务端统计当日发布数据的用户ID和所发布的数据内容,并
将统计的数据和发布的内容反馈给客户端,对于这种请求,对其定义
一个回调函数(callback函数),其中,callback函数包含本领域技术
人员通常所使用的含义,可以指通过函数指针调用的函数,例如把函
数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调
用它所指向的函数时,称为回调函数。再例如,给统计数据的请求定
义一个callback函数,则从服务端返回统计数据的结果时,将这个结
果传送到callback函数执行,以进行本请求需要处理的操作,如将统
计的结果以图表的方式进行展示。
综上,回调函数不是由该函数的实现方直接调用,而是在特定的
事件或条件发生时由另外的一方调用,用于对该事件或条件进行响
应。
对于客户端的每次请求,都对其设定一个唯一的标识号,该标识
号优选全局的、整数类型的变量。如上文所述,可将每次请求视为一
次线程的处理,而每个线程都有一个上下文,保存在线程的内核对象
中,这个上下文反映了请求执行的状态,当一个线程从挂起到恢复时,
需要恢复其上下文。由此,上文设定的标识号可以对每次请求的上下
文进行标识。
步骤S102,设置一个等待窗口(WaitWindow),将每次请求以
相应的标识号为键,并将需要处理请求所返回的数据的callback方法,
注册到等待窗口中。
具体地,等待窗口为一个窗口变量,其中,存储了客户端的一些
函数接口和服务端返回的数据。将每次请求以相应的标识号为键,注
册到等待窗口后,就可以根据标识号从等待窗口中获取相应的数据。
例如以时间为序,分别设置标识号1、2、3,以标识三个不同请求的
上下文,并将这三个请求注册到等待窗口后,就可以根据标识号从等
待窗口中获取相应的数据。
将每次请求注册到等待窗口的同时,将每次请求的函数接口也以
所述标识号为键,放入等待窗口。如上文所述,不同请求中所定义的
函数不同,如请求中定义的是callback函数,则将该请求注册到等待
窗口的同时,将该请求的callback函数接口放入等待窗口中,以等待
服务端返回该接口所需的数据。
步骤S103,针对客户端的每次请求,均由服务端返回相应的响
应包,并将响应包的数据以所述标识号为键,存入等待窗口。
具体地,客户端的请求正常到达服务端以后,由服务端进行相应
地处理,并将处理的结果返回给客户端,例如,请求服务端统计当日
的发帖量,则服务端统计完当日的发帖量后,将统计的结果返回给客
户端,当然,返回的内容中,除了统计结果,还有一些其他内容,如
网络通信协议版本号、请求的标识号(也就是SessionID)、返回消
息的长度、返回的数据类型、返回的数据内容等等。为了简明起见,
将所返回的内容定义为响应包,通常,响应包以协议的字节流形式返
回。
服务端返回响应包后,如果响应包正常到达,客户端从返回的响
应包中提取出SessionID和相关的数据,根据SessionID在等待窗口中
查找以SessionID为键的项,如果找到则调用该项的键值中相关的
Callback接口交接数据处理权。如果没有找到则丢弃数据。如果响应
包超时到达,则将所对应的窗口数据移除,并抛出超时异常,进行异
常处理。其中,将等待窗口中每一份与请求对应的数据称为窗口数据。
针对服务端返回响应包的状态信息,callback中定义了系列的事
件(event),事件的内容为:当服务端正常返回响应包时,根据相应
参数,通知客户端的相应线程进行操作,即该事件定义的是一个等待
服务端返回响应包和唤醒请求线程的过程。其中,event对象代表事
件的状态,比如服务端是否正常返回响应包。如上文所述,等待窗口
中存入了客户端所发送请求的标识号、函数接口,还有服务端返回的
响应包的数据。
步骤S104,解析所返回的响应包,获取其中的标识号,根据所
获取的标识号,将响应包中的数据传到相应的函数接口,由客户端进
行相应操作。
具体地,服务端返回响应包后,客户端对该响应包进行解析,将
相应的数据传到相应的请求线程。如上文所述,响应包中存在请求的
标识号。解析响应包时,获取其中的标识号,并找到与该标识号相同
的请求,将响应包中的数据从等待窗口中,以参数的形式传送到请求
线程中的函数接口,由函数执行相应地功能。即根据标识号,将窗口
数据传送到请求的线程,用于后续操作。
通常,将客户端和服务端的一次通信称为一次会话,如此,客户
端发送一个请求时,设置一个会话标识号,即上文提到的SessionID,
而服务端返回响应的数据时,同样,会带回一个会话标识号,通过带
回来的标识号,找到客户端中与该标识号相同的标识号,并将窗口数
据传送到该标识号的请求线程的函数接口,以进行后续操作。例如,
客户端发送一个统计当日发帖量的请求,设置本次会话的标识号为1,
如果服务端返回响应的数据中,其中的一个标识号为1,则将与标识
号1对应的窗口数据传送到标识号为1的线程的函数接口,以进行后
续操作。
需要说明的是,本实施例中,标识号与窗口数据是一一对应的,
即一个标识号对应一份窗口数据。
优选地,本实施例提供的异步网络通信方法还包括,对网络通信
的过程进行拥塞控制,具体包括以下步骤:
a)将客户端所有请求的数据结构设置成队列机制。
具体地,在本技术领域,队列是一种特殊的线性表,只允许在表
的前端进行删除操作,在表的后端进行插入操作。将客户端所有请求
的数据结构设置成队列机制,即发送时间较早的请求,排在队列的较
前端,通常越早由客户端进行处理。
b)对所述队列的长度设置一个阈值,并在客户端设置滑动窗
口,判断一定时间内队列的长度是否超过所述阈值,如果超过,则将
先加入的请求放入滑动窗口;如果在所述阈值内,则将先加入的请求
发送到服务端。
具体地,本实施例基于异步机制进行通信,换言之,客户端将请
求发送到服务端后,在未收到服务端返回的数据时,即将处理本请求
的线程进行其他的操作。由此,客户端可不断地向服务端发送请求,
一旦请求超过服务端的承受能力,就会造成服务端的数据拥塞。
为了解决数据拥塞问题,本发明在客户端设置滑动窗口,以控制
请求发送的时延。当然,滑动窗口所采用的拥塞控制算法可以为本技
术领域通用的算法。从客户端发送请求时,可通过滑动窗口,容许客
户端在接收任何响应之前传送附加的请求,滑动窗口的大小意味着服
务端还有多大的缓冲区可以用于接收请求,客户端也可以通过滑动窗
口的大小确定应该发送多少字节的请求数据。
为了使本实施例提供的异步网络通信方法更加明确,下文以回调
函数为例子进行具体说明,其中,还添加了拥塞控制机制。参照图2,
图2为根据本发明的一个优选实施例的以回调函数为例的异步网络通
信方法流程图。
根据图2,异步网络通信方法包括以下步骤:
步骤S201,客户端发起请求。
步骤S202,针对每次请求,设置一个唯一的标识号。
步骤S203,以标识号为键,将每次请求注册到等待窗口中。
步骤S204,将请求发往服务端之前,判断请求队列的长度是否
超过阈值,如果是,则进入步骤S205;如果不是,则进入步骤S206。
步骤S205,将请求放入滑动窗口中,通过拥塞控制算法控制发
送的时延。
步骤S206,将请求发往服务端。
步骤S207,服务端收到请求后,判断是否callback函数调用,如
果不是,则直接处理还返回数据,进入步骤S208;如果是,则将业
务逻辑处理结果和所述的标识号等相关信息封装后返回给客户端,进
入步骤S209。
步骤S208,处理具体的业务逻辑。
步骤S209,由客户端接收服务端发回的响应。
步骤S210,判断所接收的响应是否超时,如果是,进入步骤S211,
抛出异常,进行异常处理,结束该线程;如果不是,进入步骤S212,
进一步判断是否callback函数调用,如果是,进入步骤S213,调用
callback函数,进行相应处理,结束该线程。其中,callback函数可将
正常接收的数据返回给请求线程,也可以唤醒请求线程进行超时数据
的异常处理。
与现有技术相比,本发明所提供的异步网络通信方法具有以下优
点:
1)通过设置等待窗口和对每次请求设置标识号,使得异步通信
中,无需开启额外的线程进行异步处理,这大大降低了线程的上下文
切换频率,提高了系统响应的速度;
2)通过设置滑动窗口,可以对较好地解决服务端的数据拥塞问
题。
根据本发明的另一个方面,还提供了一种异步网络通信装置,包
括以下模块:
标识设置模块,用于针对客户端的每次请求,设置一个唯一的标
识号。
具体地,客户端的请求包括各种类型,有的请求发送到服务端后,
无需服务端返回数据,如请求将数据添加到数据库,对于这种请求,
不需要在客户端的等待窗口中做相关的注册,客户端封装相应的请求
包发往服务端,服务端在接收到这种类型的请求后直接进行相关的处
理,结果无需返回。有的请求发送到服务端后,需要服务端返回数据,
如请求服务端统计当日发布数据的用户ID和所发布的数据内容,并
将统计的数据和发布的内容反馈给客户端,对于这种请求,也对其定
义一个回调函数(callback函数),其中,callback函数包含本领域技
术人员通常所使用的含义,可以指通过函数指针调用的函数,例如把
函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为
调用它所指向的函数时,称为回调函数。再例如,给统计数据的请求
定义一个callback函数,则从服务端返回统计数据的结果时,将这个
结果传送到callback函数执行,以进行本请求需要处理的操作,如将
统计的结果以图表的方式进行展示。
综上,回调函数不是由该函数的实现方直接调用,而是在特定的
事件或条件发生时由另外的一方调用,用于对该事件或条件进行响
应。
对于客户端的每次请求,都由标识设置模块对其设定一个唯一的
标识号,该标识号优选全局的、整数类型的变量。如上文所述,可将
每次请求视为一次线程的处理,而每个线程都有一个上下文,保存在
线程的内核对象中,这个上下文反映了线程上一次执行时CPU的状
态,当一个线程从挂起到恢复时,需要恢复其上下文。由此,上文设
定的标识号可以对每次请求的上下文进行标识。
等待窗口模块,用于注册以相应的标识号为键的每次请求和存储
以相应的标识号为键的每次请求的函数接口。
具体地,等待窗口模块设置了等待窗口,等待窗口为一个窗口变
量,其中,存储了客户端的一些函数接口和服务端返回的数据。将每
次请求以相应的标识号为键,注册到等待窗口后,就可以根据标识号
从等待窗口中获取相应的数据。例如以时间为序,分别设置标识号1、
2、3,以标识三个不同请求的上下文,并将这三个请求注册到等待窗
口后,就可以根据标识号从等待窗口中获取相应的数据。
标识设置模块将每次请求注册到等待窗口的同时,由等待窗口模
块将每次请求的函数接口以所述标识号为键,放入等待窗口。如上文
所述,不同请求中所定义的函数不同,如请求中定义的是callback函
数,则将该请求注册到等待窗口的同时,将该请求的callback函数接
口放入等待窗口中,以等待服务端返回该接口所需的数据。
接收响应模块,针对客户端的每次请求而由服务端返回的相应响
应包,将其响应包的数据以所述标识号为键,存入等待窗口。
具体地,客户端的请求正常到达服务端以后,由服务端进行相应
地处理,并将处理的结果返回给客户端,例如,请求服务端统计当日
的发帖量,则服务端统计完当日的发帖量后,将统计的结果返回给客
户端,当然,返回的内容中,除了统计结果,还有一些其他内容,如
网络通信协议版本号、请求的标识号、返回消息的长度、返回的数据
类型、返回的数据内容、方法执行结果状态等等。为了简明起见,将
所返回的内容定义为响应包,通常,响应包以协议的字节流形式返回。
服务端返回响应包后,如果响应包正常到达,服务器返回数据后客户
端接收并从数据中提取SessionId,根据SessionId在等待窗口中查找以
SessionId为键的项,如果找到则调用该项Value中相关的Callback接
口交接数据处理权。如果没有找到则丢弃数据。如果响应包超时到达,
则抛出异常,进行异常处理。其中,将等待窗口中每一份与请求对应
的数据称为窗口数据。
针对服务端返回响应包的状态信息,callback中定义了系列的事
件(event),事件的内容为:当服务端正常返回响应包时,根据相应
参数,通知客户端的相应线程进行操作,即该事件定义的是一个等待
服务端返回响应包和唤醒请求线程的过程。其中,event对象代表事
件的状态,比如服务端是否正常返回响应包。如上文所述,等待窗口
中存入了客户端所发送请求的标识号、函数接口,还有服务端返回的
响应包的数据。
解析响应模块,用于解析所返回的响应包,获取其中的标识号,
根据所获取的标识号,将响应包中的数据传到相应的函数接口,由客
户端进行相应操作。
具体地,服务端返回响应包后,客户端对该响应包进行解析,将
相应的数据传到相应的请求线程。如上文所述,响应包中存在请求的
标识号。解析响应包时,获取其中的标识号,并找到与该标识号相同
的请求,将响应包中的数据从等待窗口中,以参数的形式传送到请求
线程中的函数接口,由函数执行相应地功能。即根据标识号,将窗口
数据传送到请求的线程,用于后续操作。
通常,将客户端和服务端的一次通信称为一次会话,如此,客户
端发送一个请求时,设置一个会话标识号,即上文提到的SessionID,
而服务端返回响应的数据时,同样,会带回一个会话标识号,通过带
回来的标识号,找到客户端中与该标识号相同的标识号,并将窗口数
据传送到该标识号的请求线程的函数接口,以进行后续操作。例如,
客户端发送一个统计当日发帖量的请求,设置本次会话的标识号为1,
如果服务端返回响应的数据中,其中的一个标识号为1,则将与标识
号1对应的窗口数据传送到标识号为1的线程的函数接口,以进行后
续操作。
需要说明的是,本实施例中,标识号与窗口数据是一一对应的,
即一个标识号对应一份窗口数据。
优选地,本实施例提供的异步网络通信装置还包括拥塞控制模
块,用于对网络通信的过程进行拥塞控制。拥塞控制模块具体还包括:
队列设置模块,用于将客户端所有请求的数据结构设置成队列机
制。
具体地,在本技术领域,队列是一种特殊的线性表,只允许在表
的前端进行删除操作,在表的后端进行插入操作。将客户端所有请求
的数据结构设置成队列机制,即发送时间较早的请求,排在队列的较
前端,通常越早由客户端进行处理。
滑动窗口和阈值设置模块,用于对所述队列的长度设置阈值,并
在客户端设置滑动窗口,判断一定时间内队列的长度是否超过所述阈
值,如果超过,则将先加入的请求放入滑动窗口;如果在所述阈值内,
则将先加入的请求发送到服务端。
具体地,本实施例基于异步机制进行通信,换言之,客户端将请
求发送到服务端后,在未收到服务端返回的数据时,即将处理本请求
的线程进行其他的操作。由此,客户端可不断地向服务端发送请求,
一旦请求超过服务端的承受能力,就会造成服务端的数据拥塞。
为了解决数据拥塞问题,在客户端设置滑动窗口,以控制请求发
送的时延。当然,滑动窗口所采用的拥塞控制算法可以为本技术领域
通用的算法。从客户端发送请求时,可通过滑动窗口,容许客户端在
接收任何响应之前传送附加的请求,滑动窗口的大小意味着服务端还
有多大的缓冲区可以用于接收请求,客户端也可以通过滑动窗口的大
小确定应该发送多少字节的请求数据。
本发明所提供的异步网络通信装置具有以下优点:
1)通过设置等待窗口和对每次请求设置标识号,使得异步通信
中,无需开启额外的线程进行异步处理,这大大降低了线程的上下文
切换频率,提高了系统响应的速度;
2)通过设置滑动窗口,可以对较好地解决服务端的数据拥塞问
题。
3)本发明较好地解决了线程的上下文切换和数据拥塞的问题,
提高了系统的性能。
以上所揭露的仅为本发明的几种较佳实施例而已,当然不能以此
来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,
仍属本发明所涵盖的范围。