ZMQ简介

ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,但工作起来更像是一个并发式的框架,分散在分布式系统间。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。

ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的 API 接口

跟 Socket 的区别是:普通的 socket 是端到端的(1:1的关系),而 ZMQ 却是可以N:M 的关系,人们对 BSD 套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而 ZMQ 屏蔽了这些细节,让网络编程更为简单。ZMQ 用于 node 与 node 间的通信,node 可以是主机或者是进程。

ZMQ 提供了三个基本的通信模型,分别是“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”

请求应答模式:
服务端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.REP)
socket.connect('tcp://127.0.0.1:5555')while True:message = socket.recv()print(message)response = "server response"socket.send(response.encode())

客户端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.REQ)
socket.bind("tcp://*:5555")while True:data = input("input your data:")socket.send(data.encode())response = socket.recv()print(response)

先运行服务端,再运行客户端即可开始通信。
pub sub模式
先写proto文件power_off_sub.proto

syntax = "proto3";message Response {enum Status {INVALID = 0;START_POWEROFF = 1; //上报5帧PROCESS_POWEROFF =2; //检查起自动驾驶系统、10秒车速、档位、是否有目的地点、epb拉起,关闭系统统拷贝数据CANCLE_POWEROFF = 3;SUCCESS = 4;FAILED = 5;}Status status = 1;uint32 wait_time = 2; //时间秒失败等待600s ;成功120senum FailReason {NONE = 0;GEAR_STATE = 1;   //档位是否正确SPEED = 2;        //车速是否为0EPB = 3;          // EPB是否拉起DESTINATIONS = 4; //目的地是否为空AUTO_MODE = 5;    //未起自动驾驶系统}FailReason fail_reson = 3;bool door_opened = 4;
}

protoc在当前目录下编译

protoc --python_out=./ power_off_sub.proto

pub.py文件

import zmq
import power_off_sub_pb2 as power_off_pb2
import time
import loggingclass PubSocket:def __init__(self):power_off_zmq_pub_endpoint = "tcp://127.0.0.1:39008"context = zmq.Context()self.socket = context.socket(zmq.PUB)self.socket.bind(power_off_zmq_pub_endpoint)self.sequence_num = 0self.response = response = power_off_pb2.PowerOff()self.status = 0def start(self):for i in range(2):self.response.is_power_off = Trueprint(str(self.response))self.socket.send(self.response.SerializeToString())self.response.header.Clear()time.sleep(1)if __name__ == "__main__":PubSocket().start()

这里for i in range(2)要发送两次,第一次发送数据会丢失一帧(用来广播和寻址),第二次发送才能真正开始发送。
sub,py文件

import zmq
import logging
import json
from google.protobuf import json_format
import timeimport power_off_sub_pb2class SubSocket:def __init__(self):power_off_zmq_sub_endpoint = "tcp://127.0.0.1:10003"# power_off_zmq_sub_endpoint = "tcp://127.0.0.1:39006"context = zmq.Context()self.socket = context.socket(zmq.SUB)self.socket.setsockopt(zmq.SUBSCRIBE, b'')self.socket.connect(power_off_zmq_sub_endpoint)def process(self):while True:msg = self.socket.recv()message = power_off_sub_pb2.Response()message.ParseFromString(msg)json_data = json.loads(json_format.MessageToJson(message))print(json_data)is_power_off = json_data.get("is_power_off")if __name__ == "__main__":sub_socket = SubSocket()sub_socket.process()

zmq+protobuff使用示例相关推荐

  1. 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法

    ZMQ(ØMQ.ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架.它提供的套接字可以在多种协议中传输消息,如线程间.进程间.TCP.广播等.你可以使用套接字构 ...

  2. Java序列化技术与Protobuff

    前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializabl ...

  3. php reactphp wss_workerman的基本用法(示例详解)

    workerman是什么? Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序.支持HTTP,Websocket,SSL和其他自定义协议.支持libev ...

  4. java zmq订阅_从ZMQ PUB套接字获取订户过滤器

    使用 zmq.XPUB 套接字类型,有一种方法可以检测新用户和离开用户 . 以下代码示例显示了如何: # Publisher side import zmq ctx = zmq.Context.ins ...

  5. Python zmq 讲解

    安装 pip install pyzmq-18.0.1 1. 请求应答模式(Request-Reply)(rep 和 req) 消息双向的,有来有往,req端请求的消息,rep端必须答复给req端 2 ...

  6. python pool_Python pool.Pool方法代码示例

    本文整理汇总了Python中multiprocessing.pool.Pool方法的典型用法代码示例.如果您正苦于以下问题:Python pool.Pool方法的具体用法?Python pool.Po ...

  7. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  8. ZMQ 第一章 ZeroMQ基础

    # ZMQ 第一章 ZeroMQ基础 首先得感谢原创作者的分享! **作者: Pieter Hintjens <ph@imatix.com>, CEO iMatix Corporation ...

  9. zmq 可靠的请求-应答模式

    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_ht ...

最新文章

  1. eclipse 关联 Maven本地仓库的配置
  2. 企业对网站空间的抉择有可能影响着网站日常运营水平
  3. SPI及其工作原理浅析
  4. Axis2 POJO实现WebService(一)发布
  5. ElasticSearch2.3.1环境搭建哪些不为人知的坑
  6. 时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换
  7. Asp.Net Core轻量级Aop解决方案:AspectCore
  8. matlab语言转化为python语言_matlab语言转译成python
  9. 压测学习总结(7)——Jmeter性能测试之脚本增强
  10. 你所能用到的数据结构(六)
  11. VisualBrush
  12. 解决linux 运行自动化脚本浏览器无法启动问题
  13. springboot-shiro-cas-redis集成session共享,权限共享
  14. Python学习,55道django面试题,来试试吧
  15. 163邮箱注册及授权密码开通
  16. 百度点击算法核心内容大揭秘
  17. 汇川机器人视觉定位通讯程序
  18. [设计模式学习笔记] -- 策略模式
  19. 一位外包女程序员的心酸史和无奈
  20. 求职面试找工作时,你遇到的奇葩问题?

热门文章

  1. docker容器/etc/hosts文件
  2. 华为FusionCompute详解(一)FusionSphere虚拟化套件介绍
  3. 区块链:权益证明设计哲学
  4. 点击复制号码进行复制
  5. 自动关闭微信浏览器中打开的h5页面
  6. 网络营销实验二网站搜索引擎友好性分析
  7. Mac brew 更换homebrew源为中科大源
  8. 维也纳品牌V5.0战略精心打造经验之作——维也纳怀宁独秀店
  9. 一款比较不错的由word制作帮助文档的好软件!wordToChm 专业版!推荐使用!
  10. iOS触摸屏幕后发生了什么?触摸事件全家桶