0

我是 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类型并不意味着以我想要的方式使用它。由于我是新手,因此非常感谢任何建议!

4

1 回答 1

1

使用响应套接字时,您总是回复向您发送消息的客户端。所以 Request-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 指南,它可能会回答您的大部分问题。

于 2015-05-17T13:31:05.237 回答