我在 C# 上使用 ZeroMQ 向特定工作人员发送消息时遇到问题。
应用架构如下:
例如,我想从“client1”向“worker2”发送一条消息。 但是我的应用程序发送到“worker1”然后发送到“worker2”以进行下一步。
连接到经销商的我的工人代码:
public static void RRWorker(string[] args)
{
if (args == null || args.Length < 2)
{
if (args != null)
{
if (args.Length < 1)
{
args = new string[] { "World", "tcp://127.0.0.1:5560" };
}
else
{
args = new string[] { args[0], "tcp://127.0.0.1:5560" };
}
}
else
{
args = new string[] { "World", "tcp://127.0.0.1:5560" };
}
}
string name = args[0];
string endpoint = args[1];
// Socket to talk to clients
using (var context = new ZContext())
using (var responder = new ZSocket(context, ZSocketType.REP))
{
responder.IdentityString = name;
responder.Connect(endpoint);
Console.WriteLine("Ready : " + name);
while (true)
{
// Wait for next request from client
using (ZMessage request = responder.ReceiveMessage())
{
Console.WriteLine("W "+name +" .Message count : " + request.Count);
for (int i =0; i< request.Count; i++)
{
Console.WriteLine("--W--" + request[i]);
}
// Send reply back to client
Console.WriteLine("Worker Name : {0}... ", name);
responder.Send(new ZFrame(name));
}
}
}
}
我的客户代码:
public static void RRClient(string name)
{
// Socket to talk to router
using (var context = new ZContext())
using (var requester = new ZSocket(context, ZSocketType.REQ))
{
requester.IdentityString = name;
//requester.Identity = Encoding.Unicode.GetBytes(name);
requester.Connect("tcp://127.0.0.1:5559");
ZFrame messageContent;
ZFrame destination;
var outgoing = new ZMessage();
destination = new ZFrame("Worker2");
messageContent = new ZFrame("test Message");
outgoing.Append(destination);
outgoing.Append(new ZFrame());
outgoing.Append(messageContent);
requester.Send(outgoing);
using (ZFrame reply = requester.ReceiveFrame())
{
Console.WriteLine("Client request : Hello {0}!", reply.ReadString());
}
}
}
我的经纪人(路由器/经销商)代码:
public static void RRBroker(string[] args)
{
// Prepare our context and sockets
using (var ctx = new ZContext())
using (var frontend = new ZSocket(ctx, ZSocketType.ROUTER))
using (var backend = new ZSocket(ctx, ZSocketType.DEALER))
{
frontend.Bind("tcp://*:5559");
backend.Bind("tcp://*:5560");
// Initialize poll set
var poll = ZPollItem.CreateReceiver();
// Switch messages between sockets
ZError error;
ZMessage message;
ZMessage messageTosend;
while (true)
{
if (frontend.PollIn(poll, out message, out error, TimeSpan.FromMilliseconds(64)))
{
for (int i = 0; i < message.Count; i++)
{
Console.WriteLine("--F--" + message[i].ReadString());
}
Console.WriteLine("-----" + GloFunction.ZMessageToString(message) + "---");
backend.Send(message);
}
else
{
if (error == ZError.ETERM)
return; // Interrupted
if (error != ZError.EAGAIN)
throw new ZException(error);
}
if (backend.PollIn(poll, out message, out error, TimeSpan.FromMilliseconds(64)))
{
Console.WriteLine("B Message count : " + message.Count);
for (int i = 0; i < message.Count; i++)
{
Console.WriteLine("--B--" + message[i].ToString());
}
GloFunction.Console_WriteZMessage("backend", 2, message);
frontend.Send(message);
}
else
{
if (error == ZError.ETERM)
return; // Interrupted
if (error != ZError.EAGAIN)
throw new ZException(error);
}
}
}
}
为了运行我的应用程序,我在特定线程中创建了我的所有设备(路由器、经销商、client1、client2、worker1、worker2)。
运行“client1”两次的示例:
Ready : Worker2
Ready : Worker1
--F--Client1
--F--
--F--Worker2
--F--
--F--test Message
-----Client1Worker2test Message---
W Worker2 .Message count : 3
--W--Worker2
--W--
--W--test Message
Worker Name : Worker2...
B Message count : 3
--B--Client1
--B--
--B--Worker2
backend: Worker2
Client request : Hello Worker2!
Le thread 0x3d74 s'est arrêté avec le code 0 (0x0).
--F--Client1
--F--
--F--Worker2
--F--
--F--test Message
-----Client1Worker2test Message---
W Worker1 .Message count : 3
--W--Worker2
--W--
--W--test Message
Worker Name : Worker1...
B Message count : 3
--B--Client1
--B--
--B--Worker1
backend: Worker1
Client request : Hello Worker1!
Le thread 0x4fd4 s'est arrêté avec le code 0 (0x0).
我做错了什么?