Как настроить PUB/SUB NetMQ в Xamarin Forms

У меня есть службы Windows, работающие в качестве издателя, и я пытаюсь настроить Xamarin Forms в качестве подписчика. Приведенный ниже код отлично работает в консольном приложении или LinqPad, но при копировании и вставке в Xamarin Forms SubscriberSocket просто не отвечает на сообщения с сервера.

Вы знаете, как подключить это?

Я использую NetMQ версии 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");


person Fabio S.    schedule 02.10.2018    source источник
comment
Я только что исправил одну явную ошибку. Я использовал localhost:5556, но эмулятор не на той же машине. На самом деле я запустил его на телефоне и указал на сервер, используя явный IP-адрес... к сожалению, ничего. subSocket.Connect("tcp://192.168.30.120:5556");   -  person Fabio S.    schedule 03.10.2018


Ответы (1)


Исправление для этого было двухэтапным процессом:

  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

person Fabio S.    schedule 03.10.2018