我正在尝试使用 ZeroMQ 重写我们的旧服务器之一,现在我有以下服务器设置(适用于 Zmq 请求):
using (var context = ZmqContext.Create())
using (var server = context.CreateSocket(SocketType.REP)) {
server.Bind("tcp://x.x.x.x:5705");
while (true) { ... }
如果我使用 Zmq 客户端库进行连接,这种设置效果很好context.CreateSocket(SocketType.REQ)
但不幸的是,我们有很多遗留代码需要连接到该服务器,并且套接字是使用 .net 套接字库创建的:
Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(ipAddress, port);
有没有办法编写 ZeroMQ 服务器来接受这些传统的 .net 套接字连接?
您可以使用以下方法实现此目的ZMQ_STREAM 套接字 http://api.zeromq.org/4-0:zmq-socket#toc19.
请注意,从 ZeroMQ 4.x 开始,RAW 路由器选项已被弃用 http://comments.gmane.org/gmane.network.zeromq.devel/19547对于新的 ZMQ_STREAM 套接字类型,其工作方式与 ROUTER + RAW 相同。
不过,它似乎必然会发展。
我最近尝试了 4.0.1 版本中的 ZMQ_STREAM 套接字。
您可以打开一个,使用zmq_rcv
直到您收到完整的消息(您必须自己检查消息是否完整),或者zmq_msg_rcv
让 ZeroMQ 处理它。您将收到一个标识符消息部分,就像标识符你会发现在ROUTER
套接字,后面直接跟一个ONLY body部分。它们之间没有空分隔符,就像使用REQ
套接字与一个ROUTER
插座。因此,如果您路由它们,请务必自行添加。
但请注意:如果另一端有延迟或者您的消息超过 ZeroMQZMQ_STREAM
缓冲区(我的是 8192 字节长),您的消息可以被 ZeroMQ 解释为一系列消息。
在这种情况下,您将收到尽可能多的不同 ZeroMQ 消息,包括both标识符部分and身体的一部分,你的工作就是将它们聚合起来,知道如果有几个客户正在与STREAM
套接字,它们可能会混淆。我个人使用哈希表,使用二进制标识符作为键,当我知道消息已完成并发送到下一个节点时,从表中删除条目。
通过一个发送ZMQ_STREAM
with zmq_msg_send
or zmq_send
按原样工作正常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)