基于管道的多进程间消息通信方法转让专利

申请号 : CN201110230714.8

文献号 : CN102355429A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 于晓军万雪松赵辰清

申请人 : 北京思创银联科技股份有限公司

摘要 :

本发明涉及windows进程间通信技术领域,公开了一种基于管道的多进程间消息通信方法,包括以下步骤:S1、进程向消息中心进行注册,即发送进程信息,所述消息中心是用于处理消息的服务程序,所述进程信息包括消息标识;S2、所述消息中心将与所述消息标识对应的消息发送给所述进程;在步骤S1与S2的通信过程中,进程与消息中心之间使用管道进行通信。本发明能够使各进程间通信的实现变得简单。

权利要求 :

1.一种基于管道的多进程间消息通信方法,其特征在于,包括以下步骤:S1、进程向消息中心进行注册,即发送进程信息,所述消息中心是用于处理消息的服务程序,所述进程信息包括消息标识;

S2、所述消息中心将与所述消息标识对应的消息发送给所述进程;

在步骤S1与S2的通信过程中,进程与消息中心之间使用管道进行通信。

2.如权利要求1所述的方法,其特征在于,所述消息中心与进程间以异步事件的机制实现通信。

3.如权利要求1所述的方法,其特征在于,步骤S1中,在消息中心收到进程信息之后对进程信息进行保存,而在步骤S1与S2的通信过程中,如果消息中心异常退出和被强制杀掉,消息中心在恢复之后自动根据所保存的进程信息与进程间进行重新连接。

4.如权利要求1所述的方法,其特征在于,消息中心与进程都以消息流的模式发送数据。

5.如权利要求1~4中任一项所述的方法,其特征在于,在步骤S1之前还包括消息中心进行初始化的步骤。

说明书 :

基于管道的多进程间消息通信方法

技术领域

[0001] 本发明涉及windows进程间通信技术领域,特别涉及一种基于管道的多进程间消息通信方法。

背景技术

[0002] 进程是装入内存并独立执行的程序,每个进程都有自己的私有进程空间,对其他进程是不可见的。而这些独立的进程间要交换数据就要用到进程间通信机制,进程通过这种进程间通信机制向其他进程传输控制信息,或与其他进程交换数据,但是这种通信存在单一性和不可控性,例如:a进程与b进程之间有通信需求,c进程与a、b都没有通信需求,但是c进程需要关注a,b进程的通信状态,以便做出相应的处理,这种情况下会想到,可以在a与b通信后或通信的同时与c通信告知a与b通信的状态,但这种通信方式需要控制同步问题,而且当有通信和关注通信需求的进程不是三个而是数十个,这种方案在代码实现上就会变得臃肿和不可控,当然最主要的是不利于新程序的添加。
[0003] 又如上面的例子,假如a、b、c程序都已经写好了,现在有个新的需求:要添加一个新的程序d,它要关注a与b的通信,又要与c发消息,那么就需要同时改写a、b、c程序,这显然是不可行的。
[0004] 综上,现有技术中各应用程序间之间直接进行通信,就要知道要和那个进程通信,尤其是当通信的进程并不能确定时,处理上变得不可控,而且会频繁修改代码。当有新的进程要与原来已经写好的程序通信时,就要修改原有的程序代码。以适应新的需求。

发明内容

[0005] (一)要解决的技术问题
[0006] 本发明要解决的技术问题是:如何使各进程间通信的实现变得简单。
[0007] (二)技术方案
[0008] 为解决上述技术问题,本发明提供了一种基于管道的多进程间消息通信方法,包括以下步骤:
[0009] S1、进程向消息中心进行注册,即发送进程信息,所述消息中心是用于处理消息的服务程序,所述进程信息包括消息标识;
[0010] S2、所述消息中心将与所述消息标识对应的消息发送给所述进程;
[0011] 在步骤S1与S2的通信过程中,进程与消息中心之间使用管道进行通信。
[0012] 优选地,所述消息中心与进程间以异步事件的机制实现通信。
[0013] 优选地,步骤S1中,在消息中心收到进程信息之后对进程信息进行保存,而在步骤S1与S2的通信过程中,如果消息中心异常退出和被强制杀掉,消息中心在恢复之后自动根据所保存的进程信息与进程间进行重新连接。
[0014] 优选地,消息中心与进程都以消息流的模式发送数据。
[0015] 优选地,在步骤S1之前还包括消息中心进行初始化的步骤。
[0016] (三)有益效果
[0017] 本发明由于引入了消息中心对消息进行统一处理,因此克服了现有技术中各进程间通信需要频繁修改代码的问题,从而使各进程间通信的实现变得简单;消息中心(即服务器端)与进程(即客户端)间以异步事件的机制实现,使得消息中心与进程间使用管道进行通信时不会产生阻塞,从而保障各进程间的正常消息通信;添加了灾难恢复机制,在消息中心异常退出和被强制杀掉时,仍然能够保障消息中心与进程间的正常通信,从而保障各进程间的正常消息通信;消息中心与进程都以消息流的模式发送数据(即发送的时候装包,接收后解包),使得在进程较多而消息中心较繁忙时也能保证接收的一端(某一进程)可以得到与发送时等长的数据。

附图说明

[0018] 图1是本发明的方法流程图;
[0019] 图2是本发明的方法的详细流程图。

具体实施方式

[0020] 下面结合附图和实施例,对本发明的具体实施方式作进一步详细说明。以下实施例用于说明本发明,但不用来限制本发明的范围。
[0021] 如图1、2所示,本发明提供了一种基于管道的多进程间消息通信方法。
[0022] 对于服务器端,即消息中心,首先进行如下初始化处理:
[0023] 初始化客户端队列锁,客户端(即进程)注册的信息会保存到并在该队列中维护;
[0024] 初始化删除队列锁,客户端退出或关闭后,将其注册信息移至该队列中;
[0025] 消息中心以指针队列的形式维护客户端队列和删除客户端队列,每个队列节点存储着注册的客户端id(即进程标识),和所关注的消息结构体,消息结构体包括消息id(即消息标识)、消息自定义常量、消息数据指针和消息数据长度;
[0026] 初始化通讯服务器,创建服务器端的管道,用管道的方式将序列化后的数据传出去;
[0027] 启动消息循环,处理来自客户端的消息;
[0028] 启动时间发生器回收内存:服务器端定时检查删除队列中的节点,将注销的客户端节点释放掉,以节省内存空间。
[0029] 然后等待客户端注册:
[0030] 消息中心初始化完成后,处于等待状态,当有客户端注册请求发生时,将管道中传过来的数据流进行解包,封装成结构体后作为客户端队列锁的一个节点添加到队列中。
[0031] 启动并处理消息:
[0032] 服务端注册成功后,便向客户端返回注册结果,然后等待客户端的启动消息通知(即启动命令),当接收到启动通知后,处理来自客户端的消息,处理的方式由三种:广播消息,将消息广播给所有注册的客户端;查询消息,根据查询的消息代号查找指定内容;转发消息,根据注册时的信息将消息转发给指定的客户端;将停止消息循环的客户端移至删除队列。
[0033] 删除消息注册:
[0034] 当客户端不需要关注或发送消息时,或客户端正常关闭或异常销毁时,服务器端会将客户端注册在队列中的节点删除,并将该节点添加到删除队列中,待服务器端的定时器达到预设时间时会将删除队列中的数据清除掉。
[0035] 对于客户端,进行以下处理:
[0036] 首先向服务端注册:
[0037] 注册客户端信息,包括客户端ID,关注的消息队列(其中包括关注的消息结构体,消息结构体包括消息id),服务的消息队列;
[0038] 然后向服务器端发送启动命令:
[0039] 启动命令发送成功后,当服务器端接受到客户端注册的信息时,会将与消息ID对应的消息派送给客户端。
[0040] 向服务端发送停止命令:
[0041] 当客户端不需要发消息,同时也不需要关注任何消息时,可以向服务端发送停止命令,这样服务器端就会将该客户端注册的信息在队列中删除,不再处理,如果客户端没有关闭就退出或是异常情况下崩溃,服务端也会将该客户端注册的消息删除。
[0042] 由以上实施例可以看出,本发明由于引入了消息中心对消息进行统一处理,因此克服了现有技术中各进程间通信需要频繁修改代码的问题,从而使各进程间通信的实现变得简单;消息中心(即服务器端)与进程(即客户端)间以异步事件的机制实现,使得消息中心与进程间使用管道进行通信时不会产生阻塞,从而保障各进程间的正常消息通信;添加了灾难恢复机制,在消息中心异常退出和被强制杀掉时,仍然能够保障消息中心与进程间的正常通信,从而保障各进程间的正常消息通信;消息中心与进程都以消息流的模式发送数据(即发送的时候装包,接收后解包),使得在进程较多而消息中心较繁忙时也能保证接收的一端(某一进程)可以得到与发送时等长的数据。
[0043] 以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。