最近項目需要一個類似於Android上廣播通信機制,方便多進程間相互通信,可以是一對多,多對一,或者多對多。
大致如下
Linux現有的進程間通信能用的只有
管道
消息隊列
信號量(這個還只能算同步機制)
套接字
但是這幾種幾乎都只能在兩個進程間來回傳遞,如果要實現多進程間相互通信,需要自己實現一個類似於MsgServer的消息管理服務器,負責接收不同的消息,然后分發給不同的用戶。
比如一個按鍵消息來了,監控輸入事件的應用只要將消息發送到消息中心,消息中心再將該消息分發給想獲取這個消息的用戶,消息的接收分發全部有消息服務器來處理。
基於此思想,在linux最簡便的方法就是用本地socket來做,socket服務器負責消息處理,所有的客戶端都要連接注冊上來。
服務器負責維護所有的客戶端,以及所有的消息接收和分發。
基本框架如下:
這個消息服務器就有點類似於聊天應用的服務器,客戶端就是聊天的用戶,只不過發消息的人不用知道誰會收到消息,只要發出去就好了。
首先服務器啟動后啟動三個線程,
一個負責接收客戶端連接做accept工作
一個負責接收客戶端發來的消息做recv工作
一個負責消息分發,負責處理消息的轉發send工作。
其中服務器至少要維護客戶端數據以及消息數據這兩大數據。
還有一個問題就是服務器怎么知道誰需要這條消息呢,在這里初步的設想是根據消息的類型來匹配,所有發送來的消息都需要在消息頭上注明類型,而且是已經約定好的,這樣客戶端連接注冊的時候就要告知服務器我需要哪種或者哪幾種消息。