Опубликовать сообщение с помощью PublisherSocket в C# UWP не получено в Python

Я пытаюсь передать сообщения с NetMQ в C# UWP на python.

Питон действует как подписчик, а C# как издатель.

Когда я использую C# .Net Core, я вижу сообщения, попадающие на подписчика Python, но когда я использую C# UWP, ничего не происходит, хотя код точно такой же, и я вижу, что Publisher отправляет сообщения.

Код на python: (рабочий)

import zmq
import time

def subscribe():
    port = "6789"
    context = zmq.Context()
    socket = context.socket(zmq.SUB)

    socket.connect("tcp://localhost:%s" % port)

    topicfilter = "abcde"
    socket.setsockopt(zmq.SUBSCRIBE, topicfilter)
    while True:
        string = socket.recv()
        print string


subscribe()

Код в.Net Core: (работает)

using System.Threading;
using System.Threading.Tasks;
using NetMQ;
using NetMQ.Sockets;

namespace Examples
{
    static partial class Program
    {
        public static void Main(string[] args)
        {
            Publisher();
        }

        public static void Publisher()
        {
            Task.Run(async () =>
            {
                using (var pubSocket = new PublisherSocket())
                {
                    pubSocket.Bind("tcp://*:6789");

                    for (var i = 0; i < 10; i++)
                    {
                        pubSocket.SendFrame("abcde" + i.ToString());
                        Thread.Sleep(1000);
                    }
                }

            });

        }

    }
}

Но код в UWP (не работает):

using NetMQ;
using NetMQ.Sockets;
using System.Threading;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System;

namespace test_NetMQ_UWP
{

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();
            DataContext = this;
        }

        // this event happen when I click on a button in MainPage.xaml
        private void Publisher_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(async () =>
            {
                using (var pubSocket = new PublisherSocket())
                {
                    pubSocket.Bind("tcp://*:6789");

                    for (var i = 0; i < 10; i++)
                    {
                        pubSocket.SendFrame("abcde" + i.ToString());
                        Thread.Sleep(1000);
                    }
                }

            });
        }
    }
}

Что я делаю неправильно?

1 ответ

Это нормальное поведение. Вы используете петлевой IP-адрес для сетевых коммуникаций между приложением UWP и другим процессом (другим приложением UWP или настольным приложением). Это ограничено изоляцией сети.

Вы можете запустить свой сервер и клиент на другом компьютере для тестирования. Пожалуйста, ознакомьтесь с документом Как включить петлю и устранить проблемы с изоляцией сети (приложения Windows Runtime). Это объяснило этот сценарий:

Loopback разрешен только в целях разработки. Использование приложением среды выполнения Windows, установленным вне Visual Studio, не допускается. Кроме того, приложение среды выполнения Windows может использовать петлю IP-адреса только в качестве целевого адреса для запроса клиентской сети. Поэтому приложение времени выполнения Windows, которое использует DatagramSocket или StreamSocketListener для прослушивания IP-адреса обратной связи, не получает никаких входящих пакетов.

В вашем случае, если вы просто хотите проверить, может ли приложение UWP успешно отправить сообщение вашему подписчику Python. Вы можете запустить приложение UWP на другом компьютере. Я использовал ваш код для создания приложения UWP для отправки сообщения и создания консольного приложения в качестве подписчика, которое запускается на другом компьютере. Консольное приложение может получить сообщение.

Обратите внимание, что поскольку вашему приложению UWP требуется доступ к сети во время выполнения, вам необходимо включить возможности Netwrok (Internet(Client)Internet(Client & Server)Private Networks(Client & Server)) в файле Package.appxmanifest.

Другие вопросы по тегам