原本项目用的ICE中间件,但是ICE的异步和回调稍显繁琐,而且ICE强大的地方还都用不到,所以我提出用socket代替Ice通讯,头头担心我们自己从socket构建的话很多地方考虑不到,异常断开,数据连包,大包接受不全、、、等等。还是倾向与完善的通讯,于是就提出用0mq、、所以就研究了两天zmq,初步实现了一个需要的初步框架,先探讨下zmq、、
关于zmq的介绍,请自行谷歌、、、
个人对zmq的理解,zmq就是一个高级的socket,是一个带有模型的socket、、、
其提供了四个基本的通信模型,分别是“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline ”,“pair to pair”(这个很多是不说的)。
至于每种模型的资料,网上很多的、、连接个中文的指南:https://github.com/anjuke/zguide-cn 主要学习的途径啊、、再加上官方例子。
我是做一个数据处理的,主要就是和客户端交换数据,所以我需要的是“Request-Reply “:请求响应模式,其他几个模式也就没怎么看,毕竟项目时间不多载、、
关于“Request-Reply “还有四种模式:
- DEALER: 给连接的对端RR地分发消息,对收到的消息公平排队。也叫XREQ
- REQ:在应用层外发的消息上加一层空消息再发送;在收到消息后去掉分隔空消息再返回应用层。它实质上是在DEALER上构建的,只是在此基础上强制加入了发、收循环。
- ROUTER:针对每一个收到的消息:加一层来源地址段,然后再交给应用层;针对每一个要发出的消息:去掉最上层的地址段,并以该地址段为目的地进行发送。也叫XREP
- REP:对收到的消息:储存所有的消息内容直到第一个分隔空消息段,把剩余的消息体传给应用层;对发出的消息:把之前储存的消息体加回来,并像ROUTER一样发送出去。它实质上实在ROUTER上构建的,只是在此基础上强制加入了收、发循环。
由于服务端处理数据可能需要时间,不能阻塞客户端,需要异步处理,而且需要服务端或者客户端一次发送多个包,还有服务端不能只是一个再处理,要并行处理,可能并行或者添加服务器是动态的,那样就选用了一个:[ DEALER][ ROUTER DEALER DEALER ]模式,这是个经典模式,模式图:
我的实现借助了一个大牛用Qt封装的zmq的接口,叫nzmqt:https://github.com/jonnydee/nzmqt
虽然借助他的封装,但是其部分和我实现需求不大相符就自己也简单更改了下其中的封装接口,通用的部分也push给原作者了。
由于我们数据处理可能随时增加不同的处理方式和添加发送的数据种类,我也就用了Qt的插件模式,把处理数据独立出来、、
其就是接受到数据,然后传送给插件,插件返回处理后数据。
说了这么多,云里雾里的,其实还是直接上代码最直接的,这是个雏形实现而已,其还没经过实践和时间验证的,只是跑过我简单例子而已,仅仅为了您学习而已,也不值得,也不能称为一个项目,代码地址:https://github.com/dushibaiyu/DsbyLiteExample/tree/master/0mq_Qt_Server
其中main是主框架,addon是插件工程,里面自带一个hello word的插件例子。

评论已关闭。