最近项目需要一个类似于Android上广播通信机制,方便多进程间相互通信,可以是一对多,多对一,或者多对多。
大致如下
Linux现有的进程间通信能用的只有
管道
消息队列
信号量(这个还只能算同步机制)
套接字
但是这几种几乎都只能在两个进程间来回传递,如果要实现多进程间相互通信,需要自己实现一个类似于MsgServer的消息管理服务器,负责接收不同的消息,然后分发给不同的用户。
比如一个按键消息来了,监控输入事件的应用只要将消息发送到消息中心,消息中心再将该消息分发给想获取这个消息的用户,消息的接收分发全部有消息服务器来处理。
基于此思想,在linux最简便的方法就是用本地socket来做,socket服务器负责消息处理,所有的客户端都要连接注册上来。
服务器负责维护所有的客户端,以及所有的消息接收和分发。
基本框架如下:
这个消息服务器就有点类似于聊天应用的服务器,客户端就是聊天的用户,只不过发消息的人不用知道谁会收到消息,只要发出去就好了。
首先服务器启动后启动三个线程,
一个负责接收客户端连接做accept工作
一个负责接收客户端发来的消息做recv工作
一个负责消息分发,负责处理消息的转发send工作。
其中服务器至少要维护客户端数据以及消息数据这两大数据。
还有一个问题就是服务器怎么知道谁需要这条消息呢,在这里初步的设想是根据消息的类型来匹配,所有发送来的消息都需要在消息头上注明类型,而且是已经约定好的,这样客户端连接注册的时候就要告知服务器我需要哪种或者哪几种消息。