Как использовать ZMQ, когда Сервер на IP отличается от клиента
Я научился пользоваться ZeroMQ
на localhost
, но я не смог сделать это на удаленном IP.
Q1:
Нужен ли мне брокер?
Если так, Q2:
какой брокер и как это сделать.?
Обновить:
ХОРОШО. Я использую ZMQ
Пример обновления погоды, но с удаленным IP (не localhost
). Вот что я делаю, используя C# ZMQ
привязки (однако я могу использовать любой другой язык):
Сервер ZMQ :
using (var context = new ZContext())
using (var publisher = new ZSocket(context, ZSocketType.PUB))
{
string address = "tcp://*:5001";
publisher.Bind(address);
publisher.Send("msg")
}
Прокси - сервер:
using (var context = new ZContext())
using (var frontend = new ZSocket(context, ZSocketType.XSUB))
using (var backend = new ZSocket(context, ZSocketType.XPUB))
{
// Frontend is where the weather server sits
string localhost = "tcp://127.0.0.1:5001";
Console.WriteLine("I: Connecting to {0}", localhost);
frontend.Connect(localhost);
// Backend is our public endpoint for subscribers
string remoteIP = "216.123.23.98"; // For example
var tcpAddress = string.Format("tcp://{0}:8100", remoteIP); // I also tried localhost address here
Console.WriteLine("I: Binding on {0}", tcpAddress);
backend.Bind(tcpAddress);
var epgmAddress = string.Format("epgm://localhost;{0}:8100", remoteIP);
Console.WriteLine("I: Binding on {0}", epgmAddress);
backend.Bind(epgmAddress);
using (var subscription = ZFrame.Create(1))
{
subscription.Write(new byte[] { 0x1 }, 0, 1);
backend.Send(subscription);
}
// Run the proxy until the user interrupts us
ZContext.Proxy(frontend, backend);
}
Клиент:
using (var context = new ZContext())
using (var subscriber = new ZSocket(context, ZSocketType.SUB))
{
string remoteIP = "tcp://216.123.23.98"; //For example
Console.WriteLine("I: Connecting to {0}…", remoteIP);
subscriber.Connect(connect_to);
// Subscribe to zipcode
string zipCode = args[0];
Console.WriteLine("I: Subscribing to zip code {0}…", zipCode);
subscriber.Subscribe(zipCode);
// Process 10 updates
int i = 0;
long total_temperature = 0;
for (; i < 20; ++i)
{
ZError err;
using (var replyFrame = subscriber.ReceiveFrame(out err))
{
string reply = replyFrame.ReadString(Encoding.ASCII);
Console.WriteLine(reply);
total_temperature += Convert.ToInt64(reply.Split(' ')[1]);
}
}
Console.WriteLine("Average temperature for zipcode '{0}' was {1}", zipCode, (total_temperature / i));
}
Когда я запускаю это, я получаю ошибку в сервере и ошибку в прокси - сервер получает
Invalid end point
и прокси получает EINVAL(22)
:
Invalid argument at ZeroMQ.ZSocket.Bind(String endpoint)
1 ответ
A1:
Нет, ZeroMQ
это среда обмена сообщениями без посредников
A2:
N/A
Как восстановить код?
Все сервисы должны подчиняться соответствующим правилам адресации транспортного класса, для случая TCP/IP - оба .bind()
/ .connect()
методы должны заявить обе части IP:PORT#
спецификация (с некоторыми вспомогательными средствами из DNS-разрешения для IP
часть, но :PORT#
-часть еще обязательна)
(исходный код которого не встречается в клиенте, ссылка:
subscriber.Connect(connect_to);
тогда как должен быть также Proxy
совпадение :PORT#
т.е. :8100
, указано, для правильного .connect()
).
Для ясности и для избежания port#
, удалите epgm
Транспортный класс из кода.