Как настроить PUB / SUB NetMQ в формах Xamarin - PullRequest
0 голосов
/ 02 октября 2018

Службы Windows работают в качестве издателя, и я пытаюсь настроить формы Xamarin в качестве подписчика.Приведенный ниже код прекрасно работает в консольном приложении или 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 Ответ

0 голосов
/ 03 октября 2018

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

  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

...