#zeromq #netmq
#zeromq #netmq
Вопрос:
Я пытаюсь создать программу rpc для обмена хостами, расположенными в разных сетях, и выбрал конфигурацию NetMQ для маршрутизатора-дилера, представленную здесь:http://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer
Но проблема в том, что маршрутизатор всегда выбирает случайного дилера при маршрутизации сообщения на серверную часть. Код, который я использовал :
using (var frontend = new RouterSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5556")))//"@tcp://10.0.2.218:5559"
using (var backend = new DealerSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5557")))//"@tcp://10.0.2.218:5560"
{
// Handler for messages coming in to the frontend
frontend.ReceiveReady = (s, e) =>
{
Console.WriteLine("message arrived on frontEnd");
NetMQMessage msg = e.Socket.ReceiveMultipartMessage();
string clientAddress = msg[0].ConvertToString();
Console.WriteLine("Sending to :" clientAddress);
//TODO: Make routing here
backend.SendMultipartMessage(msg); // Relay this message to the backend };
// Handler for messages coming in to the backend
backend.ReceiveReady = (s, e) =>
{
Console.WriteLine("message arrived on backend");
var msg = e.Socket.ReceiveMultipartMessage();
frontend.SendMultipartMessage(msg); // Relay this message to the frontend
};
using (var poller = new NetMQPoller { backend, frontend })
{
// Listen out for events on both sockets and raise events when messages come in
poller.Run();
}
}
Код для клиента:
using (var client = new RequestSocket(">tcp://" "127.0.0.1" ":5556"))
{
var messageBytes = UTF8Encoding.UTF8.GetBytes("Hello");
var messageToServer = new NetMQMessage();
//messageToServer.AppendEmptyFrame();
messageToServer.Append("Server2");
messageToServer.Append(messageBytes);
WriteToConsoleVoid("======================================");
WriteToConsoleVoid(" OUTGOING MESSAGE TO SERVER ");
WriteToConsoleVoid("======================================");
//PrintFrames("Client Sending", messageToServer);
client.SendMultipartMessage(messageToServer);
NetMQMessage serverMessage = client.ReceiveMultipartMessage();
WriteToConsoleVoid("======================================");
WriteToConsoleVoid(" INCOMING MESSAGE FROM SERVER");
WriteToConsoleVoid("======================================");
//PrintFrames("Server receiving", clientMessage);
byte[] rpcByteArray = null;
if (serverMessage.FrameCount == 3)
{
var clientAddress = serverMessage[0];
rpcByteArray = serverMessage[2].ToByteArray();
}
WriteToConsoleVoid("======================================");
Console.ReadLine();
}
Код для дилера:
using (var server = new ResponseSocket())
{
server.Options.Identity = UTF8Encoding.UTF8.GetBytes(confItem.ResponseServerID);
Console.WriteLine("Server ID:" confItem.ResponseServerID);
server.Connect(string.Format("tcp://{0}:{1}", "127.0.0.1", "5557"));
using (var poller = new NetMQPoller { server })
{
server.ReceiveReady = (s, a) =>
{
byte[] response = null;
NetMQMessage serverMessage = null;
try
{
serverMessage = a.Socket.ReceiveMultipartMessage();
}
catch (Exception ex)
{
Console.WriteLine("Exception on ReceiveMultipartMessage : " ex.ToString());
//continue;
}
byte[] eaBody = null;
string clientAddress = "";
if (serverMessage.FrameCount == 2)
{
clientAddress = serverMessage[0].ConvertToString();
Console.WriteLine("ClientAddress:" clientAddress);
eaBody = serverMessage[1].ToByteArray();
Console.WriteLine("Received message from remote computer: {0} bytes , CurrentID : {1}", eaBody.Length, confItem.ResponseServerID);
}
else
{
Console.WriteLine("Received message from remote computer: CurrentID : {0}", confItem.ResponseServerID);
}
};
poller.Run();
}
}
Возможно ли выбрать конкретный серверный интерфейс во внешнем интерфейсе.Прием готов?
Спасибо!
Комментарии:
1. Можете ли вы также включить рабочий код?
2. Привет. Я включил коды клиента и дилера по вашему запросу. Заранее спасибо. Жду вашего ответа.
Ответ №1:
Ваш серверный сервер также должен быть маршрутизатором. Вам нужно, чтобы работник зарегистрировался, или вам нужно знать всех доступных работников и их личность. При отправке на серверную часть введите идентификатор рабочего в начале сервера.
Взгляните на пример Majordomo в руководстве по zeromq:
http://zguide.zeromq.org/page:all#toc72
http://zguide.zeromq.org/page:all#toc98
Комментарии:
1. Спасибо. Попробую