Qt Remote Object(QtRO)给指定的客户端发送消息
概述
前面寫了兩篇文章介紹QtRO的使用方法,在這里:
Qt Remote Object(QtRO)實現(xiàn)進程間通信
Qt Remote Object(QtRO)動態(tài)Replica實現(xiàn)進程間通信
然后會帶來一個疑問,如果有多個客戶端,每個客戶端可以單獨發(fā)消息給服務(wù)端,服務(wù)端發(fā)消息,所有客戶端都能接收到,那如果說服務(wù)端只想給其中某一個客戶端發(fā)消息怎么辦呢。
效果圖
上述演示可以看到,中間是server端,左邊是Client A,右邊是Client B,兩個客戶端可以單獨給Server端發(fā)送消息,而Server端也可以選擇給那個Client端發(fā)送消息。
實現(xiàn)方式
QtRO我的使用場景一般是:一個主進程,很多功能模塊獨立出來行程了子進程exe,然后每個子進程和主進程之間進行通信,那么這里有個前提就是,已經(jīng)知道有哪些子進程了,接下來如果主進程想給指定的子進程發(fā)送消息,這里有一種比較取巧的方法,直接給對應(yīng)的子進程定義一個特有的信號。
前面的文章我們已經(jīng)介紹,實現(xiàn)QtRO一個非常關(guān)鍵的步驟,定義Rep文件,在Rep文件中已經(jīng)寫好了要共享的信號、槽、屬性等,那么我們只需要在之前的基礎(chǔ)上,添加新的信號對應(yīng)每個客戶端進程,然后客戶端單獨連接該信號,服務(wù)端就可以根據(jù)不同的信號來發(fā)送給相應(yīng)的客戶端啦,原理非常簡單。
ok,直接在以前的代碼上修改。
首先修改rep文件
class CommonInterface {SIGNAL(sigMessageToA(QString msg)) //server下發(fā)消息給clientSIGNAL(sigMessageToB(QString msg)) //server下發(fā)消息給clientSLOT(void onMessage(QString msg)) //server接收client的消息 }這里對信號做了修改,每個客戶端對應(yīng)一個信號。
然后server端新增加接口,單獨發(fā)送不同信號:
/*** @brief CommonInterface::sendMsg* @param msg* 發(fā)送消息給客戶端 B*/ void CommonInterface::sendMsgToB(const QString &msg) {emit sigMessageToB(msg); }/*** @brief CommonInterface::sendMsg* @param msg* 發(fā)送消息給客戶端 A*/ void CommonInterface::sendMsgToA(const QString &msg) {emit sigMessageToA(msg); }ok,接下來server端只需要掉用不同的接口就可以了。
而Client端更簡單,只需要連接自己對應(yīng)的信號即可,比如:
connect(m_pInterface,&CommonInterfaceReplica::sigMessageToA,this,&MainWidget::onReceiveMsg);只需要做這一小點改變即可,其他代碼大同小異,只要原理清楚了就好辦,就不全部列出來了。
后記
其實最好的方式是 當(dāng)Client端連接上Server后能夠識別到,然后Server端能夠選擇性的發(fā)送給每個Client端,這樣會更加靈活一些,不過這只是一種猜想的思路, 目前還沒得到驗證, 待后期多熟悉下Qt相關(guān)文檔后再做進一步研究。目前上述這種方式能夠滿足我需要的應(yīng)用場景。
總結(jié)
以上是生活随笔為你收集整理的Qt Remote Object(QtRO)给指定的客户端发送消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt鼠标拖动绘制基本几何图形
- 下一篇: NSIS 打包文件添加防火墙白名单