ZeroMQ Server/Client 类型的正确模式
Correct pattern for ZeroMQ Server/Client type
我有一台服务器需要为另一台机器上的客户端获取 运行 进程的指令。
客户端发送作业消息,服务器处理作业并稍后发送回结果。
我尝试使用 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);
}
}
}
你想在服务器端有一个 ROUTER 套接字,这样它可以一次接收多个请求。 (Guide)客户端的REQ sockets还是可以的,除非服务器可能会任意推送数据给它们,那么它们需要是DEALER sockets。
请注意,对于超过 REQ/RESP 的套接字,您需要手动处理消息信封(消息的第一帧指示其目的地)。 Guide
0MQ 文档非常密集......我不怪你没有从他们那里得到直觉:)
NetMQ 文档中的这个示例是完整的 ROUTER-DEALER:https://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer,您可以只使用路由器端,但它应该可以正常工作。
我有一台服务器需要为另一台机器上的客户端获取 运行 进程的指令。
客户端发送作业消息,服务器处理作业并稍后发送回结果。
我尝试使用 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);
}
}
}
你想在服务器端有一个 ROUTER 套接字,这样它可以一次接收多个请求。 (Guide)客户端的REQ sockets还是可以的,除非服务器可能会任意推送数据给它们,那么它们需要是DEALER sockets。
请注意,对于超过 REQ/RESP 的套接字,您需要手动处理消息信封(消息的第一帧指示其目的地)。 Guide
0MQ 文档非常密集......我不怪你没有从他们那里得到直觉:)
NetMQ 文档中的这个示例是完整的 ROUTER-DEALER:https://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer,您可以只使用路由器端,但它应该可以正常工作。