Я пытаюсь сделать обмен сообщениями между программами на отдельных компьютерах в локальной сети. Дизайн в основном представляет собой один «сервер», несколько «клиентов», при этом сервер отправляет сообщения клиентам и получает сообщения от клиентов, а клиенты получают сообщения от сервера и отправляют/получают клиентские сообщения между собой.
Я пытаюсь использовать для этого NetMQ, но у меня возникают проблемы с его работой в сети. Я могу прекрасно запускать серверную и клиентскую программы на одной машине, но я не уверен, как заставить их работать в сети, и я не могу найти примеры NetMQ, которые показывают это — чтобы было ясно, < strong>каждый пример, который я могу найти, использует «localhost» или какой-либо другой IP-адрес для как «издателя», так и «подписчика» (я использую шаблон Pub-Sub, но я видели то же самое, независимо от шаблона, используемого в примере).
Некоторый пример кода, использующий инфраструктуру клиент-клиент (для этого требуется инфраструктура XPub-XSub, поскольку существует несколько издателей и подписчиков):
NetMQPoller poller = new NetMQPoller();
PublisherSocket clientPub = new PublisherSocket("tcp://*:4444");
XPublisherSocket xPub = new XPublisherSocket("tcp://*:5555");
XSubscriberSocket xSub = new XSubscriberSocket("tcp://*:4444");
Proxy proxy = new proxy(xSub, xPub, poller: poller);
proxy.Start();
SubscriberSocket clientSub = new SubscriberSocket("tcp://*:5555");
poller.Add(clientSub);
poller.Add(clientPub);
poller.RunAsync();
Если я запускаю это, я получаю «приложение находится в режиме приостановки» со следующей ошибкой:
NetMQ.NetMQException HResult=0x80131500 Источник=NetMQ StackTrace: в NetMQ.Core.Transports.Tcp.TcpConnector.OutCompleted(SocketError socketError, Int32 bytesTransferred) в NetMQ.Core.IOObject.OutCompleted(SocketError socketError, Int32 bytesTransferred) в NetMQ.Core. Utils.Proactor.Loop() в System.Threading.ThreadHelper.ThreadStart_Context(состояние объекта) в System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение saveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение saveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart()
Если я изменю адрес clientSub на «tcp://127.0.0.1:5555», он запустится нормально. Однако это не сработает, поскольку подписчику необходимо получать сообщения с любого компьютера в сети.
Как мне это сделать с помощью NetMQ? Может ли кто-нибудь привести рабочий пример этого?