【发布时间】:2019-07-13 06:36:34
【问题描述】:
我正在尝试在本地网络上不同计算机上的程序之间进行消息传递。该设计基本上是一个“服务器”,多个“客户端”,服务器向客户端发送消息并从客户端接收消息,客户端从服务器接收消息,并在彼此之间发送/接收客户端消息。
我正在尝试为此使用 NetMQ,但我无法让它在网络上运行。我可以在一台机器上完美地运行服务器和客户端程序,但我不确定如何让它在网络上工作,而且我找不到任何显示这一点的 NetMQ 示例——要清楚,我能找到的每个示例都使用“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) at NetMQ.Core.IOObject.OutCompleted(SocketError socketError, Int32 bytesTransferred) 在 NetMQ.Core.Utils.Proactor.Loop() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态)在 System.Threading.ThreadHelper.ThreadStart()
如果我将 clientSub 的地址更改为“tcp://127.0.0.1:5555”,它开始正常。但是,这行不通,因为订阅者需要从网络上的任何机器接收消息。
如何使用 NetMQ 做到这一点?谁能提供一个可行的例子?
【问题讨论】:
标签: c# network-programming netmq