ZeroMQ服务器/客户端类型的正确模式

时间:2018-10-31 15:20:56

标签: c# zeromq netmq

我有一台服务器,该服务器需要获取有关在另一台计算机上为客户端运行进程的指令。

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

我尝试使用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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您希望在服务器端使用ROUTER套接字,以便它一次可以接收多个请求。 (Guide)客户端上的REQ套接字仍然可以使用,除非服务器可以将数据任意推送到它们,然后它们必须是DEALER套接字。

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

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

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