【问题标题】:ZeroMQ choose recipientZeroMQ 选择收件人
【发布时间】:2015-05-17 21:31:05
【问题描述】:

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

【问题讨论】:

    标签: zeromq netmq


    【解决方案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 guide,它可能会回答您的大部分问题。

    【讨论】:

    • 谢谢,这正是我想要的。我会阅读指南!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多