sockets - 我可以将 ZeroMQ TCP/UDP 服务器与常规 BSD TCP/UDP 套接字客户端混合使用吗?
问题描述
我可以启动 ZeroMQ TCP/UDP 服务器并使用常规 BSD TCP/UDP 套接字客户端与其通信吗?
我有几台机器相互通信,其中一些依赖于具有低级套接字客户端的库,否则这些客户端很难迁移到 ZMQ。
解决方案
问:“我可以启动 ZeroMQ TCP/UDP 服务器并使用常规 BSD TCP/UDP 套接字客户端与其通信吗?”
答:是的,但是...
好吧,在 ZeroMQ中没有什么比得上“ TCP/UDP 服务器”了。ZeroMQ 使用高级行为原型{ PUSH/PULL | PUB/SUB | REQ/REP | ... | PAIR/PAIR }
,人们可以为此选择一个或多个(是的,PUB
发送者可能会一次将消息传递给同一“套接字”原型中的所有vmci://
andipc://
和-agents )pgm://
,这是因为事实,抽象的数据泵是隐藏但“专门”的组件,它处理所有隐藏的低级细节 - 每个都有点不同,用于根据需要为每个特定的传输类提供单独的数据泵的特定细节: .tcp://
SUB
transport-classes
transport-class
transport-class
{ inproc:// | ipc:// | tipc:// | tcp:// | pgm:// | epgm:// | norm:// | vmci:// }
然而,有一个“特殊”Socket
原型可以与非 ZeroMQ 交易对手“交谈”,因此可以满足您的需求:
ZMQ_STREAM
使用传输时,类型的套接字
ZMQ_STREAM
用于从非 ØMQ 对等方发送和接收 TCP 数据tcp://
。套接字可以ZMQ_STREAM
充当客户端和/或服务器,异步发送和/或接收 TCP 数据。接收 TCP 数据时,套接字应在将消息传递给应用程序之前将
ZMQ_STREAM
包含原始对等方路由的消息部分预先添加到消息中。id
收到的消息在所有连接的对等点之间公平排队。发送 TCP 数据时,
ZMQ_STREAM
套接字应删除消息的第一部分,并使用它来确定id
消息应路由到的对等方的路由,不可路由的消息将导致错误EHOSTUNREACH
或EAGAIN
错误。要打开到服务器的连接,请使用
zmq_connect
调用,然后id
使用zmq_getsockopt()
带有ZMQ_ROUTING_ID
选项的调用获取套接字路由。要关闭特定连接,请发送路由 ID 帧,后跟零长度消息。
建立连接后,应用程序将收到一条长度为零的消息。同样,当对端断开连接(或连接丢失)时,应用程序将收到一条长度为零的消息。
您必须发送一个路由 ID 帧,然后发送一个数据帧。该
ZMQ_SNDMORE
标志是路由id
帧所必需的,但在数据帧上被忽略。
请注意传入方向上所有 ZMQ_STREAM 连接的对等方的公平队列处理。
推荐阅读
- java - 接口作为属性?
- vue.js - 带有验证器的 vuetify 中的日期选择器
- svn - 使用 Sublime Text 作为 SVN 并排比较工具
- java - Firebase RTDB 在 Android 应用中没有响应
- javascript - Highcharts 甘特图或任何图表 x 轴滚动位置位于加载图表的开始/左侧
- wordpress - 在 .htaccess wordpress 中重写
- google-apps-script - 只能在我的个人帐户中运行任何需要权限的谷歌脚本
- kubernetes - 如何使用 kubectl Patch 命令删除 Deployment volumeMounts 中的元素?
- python-3.x - 通过子类(产品)类别->产品->标签从类别类访问manyTomany字段(标签)
- git - 如何在 GitHub 中提交文件以保持其私密性