我正在用NetMQ编写我的第一个应用程序(.NET的ZeroMQ实现)。
我还需要使用传统的TCP套接字(也就是非0MQ套接字)监听客户端发送的信息。
我在官方的ZeroMQ文档here中看到了对这种套接字类型的可用性的引用,(寻找ZMQ_STREAM),但关于如何使用它的细节很少(这没有多大帮助)或者,.NET API与C ++ API有很大不同。)
offical NetMQ documentation也没有提及Streaming套接字类型。
最后,我在Github上查看了NetMQ的测试套件,并在method RawSocket中找到了对我的问题的部分答案。
以下代码段有效:
using (NetMQContext context = NetMQContext.Create())
{
using (var routerSocket = context.CreateRouterSocket())
{
routerSocket.Options.RouterRawSocket = true;
routerSocket.Bind("tcp://127.0.0.1:5599");
byte[] id = routerSocket.Receive();
byte[] message = routerSocket.Receive();
Console.WriteLine(Encoding.ASCII.GetString(id));
Console.WriteLine(Encoding.ASCII.GetString(message));
}
}
使用标准TCP / IP测试工具时,可以很好地打印byte []消息,例如像这样:
Hello World!
但是byte [] id打印出来像这样:
???♥
换句话说,我不知道id部分是什么。为什么routerSocket.Receive被调用两次? id中包含什么?这是ZeroMQ / NetMQ特有的,还是在这里提取的TCP / IP特定信息?
答案 0 :(得分:2)
感谢@Mangist指出这一点。
答案在RouterSocket文档中:
身份(有时称为地址)只是一个二进制字符串 没有任何意义,除了"这是连接的唯一句柄"。 然后,当您通过ROUTER套接字发送消息时,首先发送一个 身份框架。
当接收消息时,ZMQ_ROUTER套接字应该预先添加消息 包含消息的始发对等体的标识的部分 在将它传递给应用程序之前。收到的消息是 从所有相互关联的同行中排队等候。发送消息时 ZMQ_ROUTER套接字应删除消息的第一部分并使用 它确定消息应被路由的对等体的身份 到。
身份是一个难以理解的概念,但它是必不可少的 如果你想成为ZeroMQ专家。 ROUTER套接字发明了一个 与其相关的每个连接的随机标识。如果有 三个REQ插座连接到ROUTER插座,它将发明三个 随机标识,每个REQ套接字一个。
此图片说明了ID帧的核心概念: