如何在 Xamarin Forms 中设置 PUB/SUB NetMQ
How to setup PUB/SUB NetMQ in Xamarin Forms
我有一个 Windows 服务 运行 作为发布者,我正在尝试将 Xamarin Forms 设置为订阅者。下面的代码在控制台应用程序或 LinqPad 中工作得很好,但是当复制并粘贴到 Xamarin Forms 中时,SubscriberSocket 只是不响应来自服务器的消息。
你知道怎么接线吗?
我正在使用 NetMQ v 4.0.0.1
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
Task.Run(() => StartPubSubSocketSubscriber());
}
private void StartPubSubSocketSubscriber()
{
string topic = "TopicA";
using (var subSocket = new SubscriberSocket())
{
subSocket.Options.ReceiveHighWatermark = 1000;
subSocket.Connect("tcp://192.168.30.120:5556");
subSocket.Subscribe(topic);
while (true)
{
string messageTopicReceived = subSocket.ReceiveFrameString();
string messageReceived = subSocket.ReceiveFrameString();
Device.BeginInvokeOnMainThread(() =>
{
label.Text = messageReceived;
});
}
}
}
}
我也试过用 Task.Factory.StartNew(() => StartPubSubSocketSubscriber(), TaskCreationOptions.LongRunning);
启动后台线程,但它对发布者的消息没有反应。
谢谢。
PS.: 移除 subSocket.Connect("tcp://localhost:5556");
此问题的修复分为两步:
SubscriberSocket
错误地指向 localhost
。这是一个可以理解的错误,因为模拟器与服务器应用程序在同一台机器上运行。当 运行 在虚拟环境或其他设备上时,请确保订阅者具有明确的 IP 地址。
SubscriberSocket
没有响应的问题实际上是在服务器上。我用 pubSocket.Bind("tcp://localhost:5556");
设置了它,一旦我将它更改为 pubSocket.Bind("tcp://*:5556");
,SubscriberSocket 就开始响应。这是文档中的错误。
解决方案的提示来自 NetMQ github 问题跟踪:
https://github.com/zeromq/netmq/issues/747
我有一个 Windows 服务 运行 作为发布者,我正在尝试将 Xamarin Forms 设置为订阅者。下面的代码在控制台应用程序或 LinqPad 中工作得很好,但是当复制并粘贴到 Xamarin Forms 中时,SubscriberSocket 只是不响应来自服务器的消息。
你知道怎么接线吗?
我正在使用 NetMQ v 4.0.0.1
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
Task.Run(() => StartPubSubSocketSubscriber());
}
private void StartPubSubSocketSubscriber()
{
string topic = "TopicA";
using (var subSocket = new SubscriberSocket())
{
subSocket.Options.ReceiveHighWatermark = 1000;
subSocket.Connect("tcp://192.168.30.120:5556");
subSocket.Subscribe(topic);
while (true)
{
string messageTopicReceived = subSocket.ReceiveFrameString();
string messageReceived = subSocket.ReceiveFrameString();
Device.BeginInvokeOnMainThread(() =>
{
label.Text = messageReceived;
});
}
}
}
}
我也试过用 Task.Factory.StartNew(() => StartPubSubSocketSubscriber(), TaskCreationOptions.LongRunning);
启动后台线程,但它对发布者的消息没有反应。
谢谢。
PS.: 移除 subSocket.Connect("tcp://localhost:5556");
此问题的修复分为两步:
SubscriberSocket
错误地指向localhost
。这是一个可以理解的错误,因为模拟器与服务器应用程序在同一台机器上运行。当 运行 在虚拟环境或其他设备上时,请确保订阅者具有明确的 IP 地址。SubscriberSocket
没有响应的问题实际上是在服务器上。我用pubSocket.Bind("tcp://localhost:5556");
设置了它,一旦我将它更改为pubSocket.Bind("tcp://*:5556");
,SubscriberSocket 就开始响应。这是文档中的错误。
解决方案的提示来自 NetMQ github 问题跟踪: https://github.com/zeromq/netmq/issues/747