Опубликовать сообщение с помощью 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.