Правильный шаблон для типа ZeroMQ Server / Client - PullRequest
0 голосов
/ 31 октября 2018

У меня есть сервер, которому нужно получить инструкции для запуска процессов для клиентов на другом компьютере.

Клиенты отправляют сообщение о работе, Сервер обрабатывает работу, а затем отправляет обратные результаты.

Я пытался использовать шаблон запроса-ответа 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 голосов
/ 31 октября 2018

Требуется сокет ROUTER на стороне сервера, чтобы он мог принимать несколько запросов одновременно. ( Guide ) Сокеты REQ на стороне клиента все еще в порядке, если только сервер не может произвольно передавать на них данные, тогда они должны быть сокетами ДИЛЕРА.

Обратите внимание, что для сокетов, выходящих за пределы REQ / RESP, необходимо вручную обрабатывать конверт сообщения (первый кадр сообщения, указывающий его назначение). Руководство

Документы 0MQ невероятно плотные ... Я не виню вас за то, что вы их не интуитивно поняли :)

Этот пример из документации по NetMQ является полным ROUTER-DEALER: https://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer, вы можете использовать только сторону маршрутизатора, и она должна работать так же.

...