(1)对于Request类型的socket,它是同步的,它一个时刻只能对一个连接进行操作,在一个连接上发送了数据之后,必须接着在这个连接上执行recv,也就是send与recv必须同时匹配出现

(2)Response类型的socket也是同步的,与Request的意思差不多,不过顺序是先recv再send

(3)Router类型的socket是异步的,他可以在随时执行recv与send,而不必在同一时刻必须要强制在某个连接上进行操作,它会根据标志帧来具体的区分应该在哪一个链接上进行操作

(4)Dealer类型的socket,这个更简单的,异步。。。它基本上就没做啥工作。

ROUTER和DEALER模式

  1. DEALER就像是一个异步的REQ,而ROUTER就像一个异步的REP。所以可以相互使用。

  2. ROUTER做代理可以提供可靠的模式来分别识别客户端和后端服务器。

  3. 大部分的关键字都是可以相互之间建立新的模式或者组合新的模式。

  4. 这些只是基础的模式,根据需求可以设计自己需要的模式。

ROUTER担任代理

graph LR

clientA-->ROUTER1(接收客户端消息)
clientB-->ROUTER1
clientC-->ROUTER1ROUTER2-->DEALER(服务端连接)-->workerA -->ROUTER2
ROUTER2-->DEALER(服务端连接)-->workerB -->ROUTER2
ROUTER2-->DEALER(服务端连接)-->workerC -->ROUTER2 ROUTER1-->clientA (客户端的连接 将服务端处理完接收到的消息发送给客户端)
ROUTER1-->clientB
ROUTER1-->clientCROUTER1和ROUTER2在轮询,交互消息 例子中 frontend 和 backend 就是这两个连接
ROUTER1(绑定客户端)作用:接收客户端消息 服务端处理完 将信息返回给客户端
ROUTER2(绑定服务端)作用:绑定服务端的DEALER连接 来做数据交互
DEALER (接收服务端ROUTER2转发的数据  处理之后   返回给ROUTER2)

异步的交互消息 N:M

例子:
转发消息
ROUTER fontend 6001 (与客户端连接,接收客户端消息,将服务端处理完的消息返回给客户端)
ROUTER backend 6002(与服务端连接,转发给服务器消息,并接收服务端处理完的消息)
worker (处理消息)
DEALER 6002 (连接6002 接收转发的消息并处理 返回给6002连接)

中间处理的代码

import zmq
context = zmq.Context()
frontend = context.socket(zmq.ROUTER)
frontend.bind(“tcp://*:6001”)
backend = context.socket(zmq.ROUTER)
backend.bind("tcp://*:6002")
frontend.setsockopt(zmq.RCVHWM, 100)
# backend.setsockopt(zmq.SNDHWM, 1)workers_list = OrderedDict()
clients_list = {}
poller = zmq.Poller()poller.register(backend, zmq.POLLIN)
poller.register(frontend, zmq.POLLIN)
clients_list = {}   #记录客户端的连接信息
while True:socks = dict(poller.poll(1000))                                  #轮询处理if (backend in socks and socks[backend] == zmq.POLLIN):worker_addr,client_addr,reply  = backend.recv_multipart()    #接受服务器处理完的信息 带地址workers_list[worker_addr]=1                                  #记录worker的地址if client_addr in clients_list:                              #服务端处理完客户端的消息  frontend.send_multipart([client_addr, reply])            #客户端将服务端处理完的消息返回给客户端else:pass                                                        #没有这个客户端  做一些记录if len(workers_list) > 0:if (frontend in socks and socks[frontend] == zmq.POLLIN):client_addr,request = frontend.recv_multipart()           #接收客户端的信息   包含客户端地址clients_list[client_addr] = 1                           #记录客户端的连接地址worker_id = workers_list.popitem(False)[0]                #记录 idbackend.send_multipart([worker_id,client_addr,request])   #转发客户端的消息和id地址  让服务端处理

服务端代码

import zmq
context = zmq.Context()
responser = context.socket(zmq.DEALER)
responser.setsockopt(zmq.RCVTIMEO, 10000)
responser.connect("tcp://localhost:6002")
while True:ident, message = response_socket.recv_multipart()pass_response = "1"                                                      #处理完的数据response_socket.send_multipart([ident, _response])

zmq 模式 ROUTER和DEALER 的实例相关推荐

  1. zmq系列--Router和Dealer模式

    大概意思: 这两种模式是对请求应答模式的扩展,一般的请求应答模式是同步的,服务端发送了数据,要等到客户端接收到数据后再发送回服务端才可以. 而这个新模式是异步的,不需要等到客户端返回数据,就可以继续发 ...

  2. 手把手教你应用三种工厂模式在SpringIOC中创建对象实例【案例详解】

    目录 一.工厂模式介绍 二.通过静态工厂方法创建Bean实例 三.通过实例工厂方法创建Bean实例 四.通过自定义的factoryBean来创建bean对象 Hello,你好呀,我是灰小猿!一个超会写 ...

  3. C# EF Core 简单工厂模式,接口多继承实例(三)

    一.说明 1.本实例是基于.Net Core 1.1,EF Core 1.1的代码实例,仅供参考 2.当前版本的EF Core好像还没有提供模型验证,异常跟踪等 二.实体层,自动 生成 三 .接口层 ...

  4. ZMQ模式详解——发布/订阅模式

    一个例子 1.一个服务器负责生成天气相关数据(邮编.温度.湿度),然后将这些数据发布到所有需要知悉天气的客户端: 2.一个客户端需要时刻更新和获取最新的邮政编码,在没有获取之前可默认为纽约地区. ## ...

  5. python文件对象提供了3个读方法、分别是-Python读写文件模式和文件对象方法实例详解...

    本文实例讲述了Python读写文件模式和文件对象方法.分享给大家供大家参考,具体如下: 一. 读写文件模式 利用open() 读写文件时,将会返回一个 file 对象,其基本语法格式如: open ( ...

  6. 单件模式的两个简单实例

    计数器功能 实际用途 : 网站访问量的统计: 代码 : /// /// whs /// 声明一个单件模式的对话类 /// 注意的事项 /// 1 构造函数必须是所有的. /// 2 创建实例的函数必须 ...

  7. php设计一个盒子类代码_PHP设计模式之备忘录模式(Memento)代码实例大全(25)...

    目的[1] 它提供了在不破坏封装(对象不需要具有返回当前状态的函数)的情况下恢复到之前状态(使用回滚)或者获取对象的内部状态. 备忘录模式使用 3 个类来实现:Originator,Caretaker ...

  8. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  9. php openssl支持的加密算法和加密模式及加密解密示范实例

    <style> textarea{width:88%;height:188px;} </style><?php // 定义要加密的数据 $data = '我是中文@Thi ...

最新文章

  1. Git 最全命令总结都在这里了
  2. 025_Excel知识汇总
  3. python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...
  4. spring boot创建多模块聚合工程
  5. 【原】Python基础-函数
  6. 2021年春季学期期末统一考试 金融统计分析 试题(开卷)
  7. 排序算法(二)--堆排序(JAVA)
  8. jQuery 学习-DOM篇(一):jQuery 创建元素并添加属性
  9. Chip Probe(CP)测试
  10. A*算法之野人传教士问题 python解法
  11. focal loss详解
  12. 视频转GIF+GIF录制
  13. 食物相克表食物最佳搭配
  14. 流体力学基础——流体静力学
  15. 2012年08月20日
  16. 电子巡更系统服务器,一种基于iBeacon技术的电子巡更系统技术方案
  17. matlab 云图标尺输出,ANSYS应力云图怎么输出结果云图?
  18. 老乡鸡冲刺“中式快餐第一股“:净利掉队、扩张受阻,能借IPO起飞?
  19. U盘插入电脑提示需要格式化
  20. 华容一中高考2021成绩查询,高考放榜后 华容一中的这两个老师开心地笑了……...

热门文章

  1. 北京大学数据科学计算机科学与技术,北大考博辅导:北京大学数据科学(计算机科学与技术)考博难度解析及经验分享...
  2. 什么是命名空间,为什么要使用命名空间?
  3. Turbine聚合监控
  4. 安徽省16个地级市行政区划 (2023)
  5. python中demo什么意思_python中demo是什么
  6. C语言案例教学设计论文,【教学设计论文】C语言中冒泡排序算法教学设计(共2525字)...
  7. Tomcat 虚拟主机案例
  8. android Region 类介绍
  9. 书中自有黄金屋,书中自有颜如玉
  10. 大家挤破脑袋都想进的腾讯,你为什么想要辞职?