我正在使用Python和Java的ZeroMQ / ZMQ并且有一个问题。发送较短的字符串时,ZMQ使用此处描述的一个字节(http://zguide.zeromq.org/page:all#A-Minor-Note-on-Strings)
然后进入线路的是一个长度(一个字节表示更短 字符串)和字符串内容作为单个字符。
有人知道发送更长字符串时使用了多少字节吗?
答案 0 :(得分:0)
通过ZMQ发送时,用于更长字符串的字节数是多少?
您的帖子确实是指历史文字 - zguide页。
虽然这在ZeroMQ v.2.x早期确实是一个非常有用的第一读源,但今天我们生活在distributed-sysems,涵盖了许多版本,从v.2.1 +,3.x, 4.x,4.2是2018年至Q2期间最后一个稳定的API版本。
在接收者实际设置/接受链接设置和 .recv()
之前,没有人可以先验猜测消息发送方使用的API版本 - 相应的消息。在v4.0 API之后依赖基于C-lang的 s_recv()
-helper技巧并不是一个可靠的方向。
在python中,许多协议硬连线的细节仍然超出你的视线,但是有一些字节映射,完全像在公布的ZeroMQ RFC / ZMTP规范中所灌输的仁慈的独裁统治一样被填充。< / p>
是的,我们可以试验一下。最佳设置受控distributed-system实验。
节点A:发件人
可以是pythonic,作为发送者:
- 设置 REQ
-archetype AccessNode (详见 "ZeroMQ Hierarchy in less than a five seconds" ),<登记/>
- 使用随机生成的静态标识设置 .setsockopt( zmq.IDENTITY, ... )
,
- 设置 .setsockopt( zmq.REQ_RELAXED, 1 )
,
- .bind()
将其添加到已选择的运输类的已知端点上
- 启动 xrange()
- 生成器控制的 for L in xrange( 1, int( 1E+9 ) )
-loop .send()
-s >
- 加载有效负载 .send( r"{0:}|{1:}".format( str( L ), L * r"*" ) )
- 为REP方面处理相应的.recv()
&#34;回答&#34;,
- 根据发送方侧的套接字容量和发送更多有效负载的能力,检查错误状态并调整time.sleep()
- s / re-loops
节点B:接收器| MitM-sniffer
应该尽可能低级别,以便解组RFC / ZMTP有线协议,因此python离开候选列表。其他选项可能包括线级嗅探器,如果所选的传输类允许(ipc://
或vmci://
不允许)
ROUTER
-archetype AccessNode,.connect()
它已知道节点A使用的传输类端点,.recv()
- 消息,如果您的实验已正确获取/嗅探了有关已知有效负载组合的符合ZMTP标准的传输大小的有线级详细信息,那么您的问题将在 string
上获得可重复,可验证,定量更正的记录 -size到message-size mapping-function。
奖励点:对于那些确实感兴趣的人。 。 。
接下来,重新运行上面的受控白盒distributed-system实验,现在有了节点A:发件人 - 将其行为扩展为{随机|确定性地} {改变|改变它自己的配置
(或将这两个选项映射到一对相同的有效载荷上 - .send()
- s)
与 .setsockopt( zmq.REQ_CORRELATE, { on | off } )
在其 for
-loop内,并记录预期输出中观察到的变化。
就API v.4.2.x在2018年至第二季度允许的情况而言,这为最终答案增加了最后的答案。