如何在 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");

此问题的修复分为两步:

  1. SubscriberSocket 错误地指向 localhost。这是一个可以理解的错误,因为模拟器与服务器应用程序在同一台机器上运行。当 运行 在虚拟环境或其他设备上时,请确保订阅者具有明确的 IP 地址。
  2. SubscriberSocket 没有响应的问题实际上是在服务器上。我用 pubSocket.Bind("tcp://localhost:5556"); 设置了它,一旦我将它更改为 pubSocket.Bind("tcp://*:5556");,SubscriberSocket 就开始响应。这是文档中的错误。

解决方案的提示来自 NetMQ github 问题跟踪: https://github.com/zeromq/netmq/issues/747