ZeroMQ 选择收件人

ZeroMQ choose recipient

我是 ZeroMQ(以及一般网络)的新手,并且对在多个客户端连接到单个服务器的设置中使用 ZeroMQ 有疑问。我的情况如下:

--1台服务器
--多个客户端

--客户端向服务器发送消息:这部分我已经知道怎么做了
--服务器向特定客户端发送消息:这是我遇到问题的部分。当某些事件在服务器上得到处理时,服务器将需要向特定客户端发送消息——而不是所有客户端。换句话说,服务器需要能够选择将给定消息发送到哪个客户端。

现在,这是我的服务器代码:

using (NetMQContext ctx = NetMQContext.Create())
{
    using (var server = ctx.CreateResponseSocket())
    {
        server.Bind(@"tcp://127.0.0.1:5555");
        while (true)
        {
            string fromClientMessage = server.ReceiveString();
            Console.WriteLine("From Client: {0}", fromClientMessage);

            server.Send("ack"); // There is no overload for the 'Send'
                                   method that takes an IP address as an argument!
        }
    }
}

我感觉问题出在我的设计有误,ResponseSocket 类型不应该按照我想要的方式使用。由于我是新手,非常感谢任何建议!

使用 Response 套接字时,您总是回复向您发送消息的客户端。所以请求-响应套接字类型在一起只是简单的请求响应。

对于更复杂的场景,您可能需要使用 Dealer-Router。

对于路由器,每条消息的第一帧是路由 ID(向您发送消息的客户端的身份)

因此您的路由器示例如下所示:

using (NetMQContext ctx = NetMQContext.Create())
{
    using (var server = ctx.CreateRouterSocket())
    {
        server.Bind(@"tcp://127.0.0.1:5555");
        while (true)
        {
            byte[] routingId = server.Receive();
            string fromClientMessage = server.ReceiveString();
            Console.WriteLine("From Client: {0}", fromClientMessage);

            server.SendMore(routingId).Send("ack");
        }
    }
}

我还建议阅读 zeromq guide,它可能会回答您的大部分问题。