Опубликовать сообщение с помощью PublisherSocket в C # UWP не получено в Python - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь передать сообщения с 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 Ответ

0 голосов
/ 21 февраля 2019

Это нормальное поведение.Вы используете петлевой 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)) в пакете.файл appxmanifest.

...