【问题标题】:Correct pattern for ZeroMQ Server/Client typeZeroMQ 服务器/客户端类型的正确模式
【发布时间】:2019-04-04 19:44:02
【问题描述】:

我的服务器需要获取指令以在另一台机器上为客户端运行进程。

客户端发送作业消息,服务器处理作业并稍后发送回结果。

我尝试使用 NetMQ 请求-响应模式(见下文)

这适用于 1 个客户端,但如果第二个客户端在之前的客户端作业完成之前发送请求 - 我会收到错误消息。

我真的需要能够接收来自客户的临时消息,并在它们完成后发送结果。显然,我使用了错误的模式,但阅读 ZeroMQ 文档并没有突出显示更合适的模式。

namespace Utils.ServerMQ
{
    class ServerMQ
    {
        public static void Go()
        {
            using (var responseSocket = new ResponseSocket("@tcp://*:393"))
            {
                while (true)
                {
                    Console.WriteLine("Server waiting");
                    var message = responseSocket.ReceiveFrameString();

                    Console.WriteLine("Server Received '{0}'", message);

                    //System.Threading.Thread.Sleep(1000);
                    var t2 = Task.Factory.StartNew(() =>
                    {
                        RunProcMatrix(message, responseSocket);
                    });

                }
            }
        }

        public static void RunProcMatrix(object state, ResponseSocket responseSocket)
        {
            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = Path.Combine(@"H:\Projects\Matrix\Matrix\bin\Debug\", "Matrix001.exe"),
                    Arguments = (string)state,
                    WindowStyle = ProcessWindowStyle.Normal,
                    CreateNoWindow = false
                }
            };
            process.Start();
            process.WaitForExit();


            responseSocket.SendFrame((string)state);
        }
    }
}

【问题讨论】:

    标签: c# zeromq netmq


    【解决方案1】:

    您希望在服务器端有一个 ROUTER 套接字,这样它就可以一次接收多个请求。 (Guide) 客户端的 REQ 套接字仍然可以,除非服务器可以任意向它们推送数据,那么它们需要是 DEALER 套接字。

    请注意,对于 REQ/RESP 之外的套接字,您需要手动处理消息信封(消息的第一帧指示其目的地)。 Guide

    0MQ 文档非常密集……我不怪你没有从他们那里凭直觉 :)

    NetMQ 文档中的这个示例是完整的 ROUTER-DEALER:https://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer,您可以只使用路由器端,但它应该可以正常工作。

    【讨论】:

    • 谢谢 - 有这种组合的例子吗?一个简单的!
    • @ManInMoon 添加了文档中的示例。不幸的是,这部分 0MQ 的学习曲线非常陡峭。
    • 我刚刚将上面的 ResponseSocket 切换到路由器套接字,代码运行没有任何变化,但我收到很多空消息!
    • @ManInMoon 那是因为您看到的是邮件信封。您必须调整您的读取代码来处理它(RESP 套接字在交给用户之前会剥离信封)
    • 我现在可以读取 routerSocket 中的消息 - 但 HasOut 是错误的 - 因此我无法向客户端发送消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多