c# - 网络上的 NetMQ
问题描述
我正在尝试在本地网络上不同计算机上的程序之间进行消息传递。该设计基本上是一个“服务器”,多个“客户端”,服务器向客户端发送消息并从客户端接收消息,客户端从服务器接收消息,并在彼此之间发送/接收客户端消息。
我正在尝试为此使用 NetMQ,但我无法让它在网络上工作。我可以在一台机器上完美地运行服务器和客户端程序,但我不确定如何让它在网络上工作,而且我找不到任何显示这一点的 NetMQ 示例——要清楚,每个例如,我可以找到“发布者”和“订阅者”都使用“本地主机”或其他 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(Object state) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper 的 executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx)。线程开始()
如果我将 clientSub 的地址更改为“tcp://127.0.0.1:5555”,它开始正常。但是,这行不通,因为订阅者需要从网络上的任何机器接收消息。
如何使用 NetMQ 做到这一点?任何人都可以提供一个可行的例子吗?
解决方案
默认情况下,当你使用套接字的构造函数时,要么是绑定要么是连接,这取决于套接字类型。发布者绑定(监听)和订阅者连接。因此,将 * 用于订阅者确实有意义。
您正在使用 tcp 传输,因此您必须在连接时指定远程对等方的 IP 地址。如果您想连接到多个发布者,您可以调用 connect 或提供 s 字符串,其中包含多个以逗号分隔的地址。
底线而不是 *、localhost 或 127.0.0.1 使用发布者机器的 IP 地址。
您可以使用 @ 或 > 前缀来覆盖构造函数的默认值。@ 绑定和 > 连接。
NetMQPoller poller = new NetMQPoller();
PublisherSocket clientPub = new PublisherSocket(">tcp://192.168.0.15: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://192.168.0.15:5555");
poller.Add(clientSub);
poller.Add(clientPub);
poller.RunAsync();
192.168.0.15 是我的 IP 地址。您需要将其更改为您的ip。
推荐阅读
- django - 如何将 id 存储在数据库中,但在 Django 的 modelchoicefield 中显示名称?
- reactjs - React、TypeScript Hero 和 TSLint 问题
- reactjs - 使用 useEffect 避免在多个 firebase 快照上重新渲染
- flutter - FlatButton 子项不在按钮内居中
- amazon-web-services - AWS Api 网关对 .NET Core 中 JSON 的响应
- python - Gunicorn:尝试启动烧瓶服务器时无法在“wsgi”中找到属性“app”
- android - Facebook 客户聊天插件未在 Android 手机 Chrome 移动浏览器上显示
- ios - Swift:如何自动将 Main.storyboard 用于纵向,将 Main_landscape.storyboard 用于横向?
- c++ - 为什么在不是“*this”的任何东西上使用基于范围的for循环时,我会得到“与运算符*不匹配”?
- html - 实现 - 下拉菜单不会显示