当前位置:   article > 正文

Qt Remote Object(QtRO)给指定的客户端发送消息_qtro 多客户端

qtro 多客户端

概述

前面写了两篇文章介绍QtRO的使用方法,感兴趣的可以到我的职主页看。

然后会带来一个疑问,如果有多个客户端,每个客户端可以单独发消息给服务端,服务端发消息,所有客户端都能接收到,那如果说服务端只想给其中某一个客户端发消息怎么办呢。

效果图

上述演示可以看到,中间是server端,左边是Client A,右边是Client B,两个客户端可以单独给Server端发送消息,而Server端也可以选择给那个Client端发送消息。

实现方式

QtRO我的使用场景一般是:一个主进程,很多功能模块独立出来行程了子进程exe,然后每个子进程和主进程之间进行通信,那么这里有个前提就是,已经知道有哪些子进程了,接下来如果主进程想给指定的子进程发送消息,这里有一种比较取巧的方法,直接给对应的子进程定义一个特有的信号。

前面的文章我们已经介绍,实现QtRO一个非常关键的步骤,定义Rep文件,在Rep文件中已经写好了要共享的信号、槽、属性等,那么我们只需要在之前的基础上,添加新的信号对应每个客户端进程,然后客户端单独连接该信号,服务端就可以根据不同的信号来发送给相应的客户端啦,原理非常简单。

ok,直接在以前的代码上修改。

首先修改rep文件

  1. class CommonInterface
  2. {
  3. SIGNAL(sigMessageToA(QString msg)) //server下发消息给client
  4. SIGNAL(sigMessageToB(QString msg)) //server下发消息给client
  5. SLOT(void onMessage(QString msg)) //server接收client的消息
  6. }

这里对信号做了修改,每个客户端对应一个信号。

然后server端新增加接口,单独发送不同信号:

  1. /**
  2. * @brief CommonInterface::sendMsg
  3. * @param msg
  4. * 发送消息给客户端 B
  5. */
  6. void CommonInterface::sendMsgToB(const QString &msg)
  7. {
  8. emit sigMessageToB(msg);
  9. }
  10. /**
  11. * @brief CommonInterface::sendMsg
  12. * @param msg
  13. * 发送消息给客户端 A
  14. */
  15. void CommonInterface::sendMsgToA(const QString &msg)
  16. {
  17. emit sigMessageToA(msg);
  18. }

ok,接下来server端只需要掉用不同的接口就可以了。

而Client端更简单,只需要连接自己对应的信号即可,比如:

  1. connect(m_pInterface,&CommonInterfaceReplica::sigMessageToA,
  2. this,&MainWidget::onReceiveMsg);

只需要做这一小点改变即可,其他代码大同小异,只要原理清楚了就好办,就不全部列出来了。

后记

其实最好的方式是 当Client端连接上Server后能够识别到,然后Server端能够选择性的发送给每个Client端,这样会更加灵活一些,不过这只是一种猜想的思路, 目前还没得到验证, 待后期多熟悉下Qt相关文档后再做进一步研究。目前上述这种方式能够满足我需要的应用场景。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/184753
推荐阅读
相关标签
  

闽ICP备14008679号