2013-06-18 81 views
5

我想重新写使用ZeroMQ我们的老服务器中的一个,现在我有以下服务器设置,(该协会致力于ZMQ请求):ZeroMQ可以用来接受传统的套接字请求吗?

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套接字连接?

回答

11

可以使用ZMQ_STREAM sockets实现这一目标。

请注意,自zeroMQ 4.x以来,RAW路由器选项has been deprecated用于新的ZMQ_STREAM套接字类型,其工作方式与ROUTER + RAW相同。

虽然它似乎必然会发展。

我最近试过版本4.0.1中的ZMQ_STREAM套接字。

你可以打开一个,使用zmq_rcv,直到你收到整个消息(你必须检查它是整个你自己)还是zmq_msg_rcv,让ZeroMQ处理它。您将收到标识符消息的一部分,就像标识你会发现在ROUTER插座,直接跟着一个ONLY身体一部分。它们之间没有空的分隔符,就像使用REQ套接字与ROUTER套接字对话一样。所以如果你路由他们,一定要自己添加它。

请注意:如果在另一端存在延迟或者您的消息超过了ZeroMQ ZMQ_STREAM缓冲区(我的长度为8192字节),则您的消息可以被zeroMQ解释为一系列消息。

在这种情况下,您会收到许多不同的ZeroMQ消息,包括标识符部身体的一部分,它是你的工作,聚集他们,因为他们知道如果几个客户交谈的STREAM插座,他们可能会混合起来。我个人使用一个使用二进制标识符作为关键字的哈希表,并且当我知道消息完成并发送到下一个节点时,从表中删除条目。

通过ZMQ_STREAM通过zmq_msg_sendzmq_send发送正常。

3

您可能必须使用zmq的RAW套接字类型(而不是REP)来连接并读取客户端数据,而不使用zmq特定的帧。用C

HTTP服务器(从彼得的博客)
http://hintjens.com/blog:42

原始套接字类型信息
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55

+0

嘿@Raffian,谢谢,但不知道如何实现这一点。没有RAW的SocketType,你有没有可以提供的例子? –

+1

是的,这是一个Pieter写的,http://hintjens.com/blog:42,它基本上是一个使用zmq原始套接字的HTTP服务器,它使用C语言,但是只要你能够将它移植到.net,就可以。它支持'RAW'套接字,我知道纯粹的Java zmq库(jeromq)不...希望它有帮助。 – raffian

+0

谢谢@Raffian,我不能直接链接到ZMQ库,我使用的是clrzmq,.Net实现,所以这可能是不可能的 –