【问题标题】:Publish message with PublisherSocket in C# UWP does not received in python在 C# UWP 中使用 PublisherSocket 发布消息在 python 中未收到
【发布时间】:2019-07-14 09:23:07
【问题描述】:

我正在尝试使用 C# UWP 中的 NetMQ 将消息传递给 python。

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);
                    }
                }

            });
        }
    }
}

我做错了什么?

【问题讨论】:

  • socket.setsockopt(zmq.SUBSCRIBE, topicfilter)zmq 选项,Python代码中必须放在连接前,试试看。
  • 谢谢,但这并不能解决问题。

标签: c# uwp zeromq pyzmq netmq


【解决方案1】:

这是正常行为。你将 IP 环回地址用于 UWP 应用和不同进程(不同的 UWP 应用或桌面应用)之间的网络通信。这受到网络隔离的限制。

您可以在不同的机器上运行您的服务器和客户端进行测试。请参阅文档How to enable loopback and troubleshoot network isolation (Windows Runtime apps)。它已经解释了这种情况:

Loopback 仅允许用于开发目的。不允许安装在 Visual Studio 之外的 Windows 运行时应用使用。此外,Windows 运行时应用只能将 IP 环回用作客户端网络请求的目标地址。因此,使用 DatagramSocket 或 StreamSocketListener 侦听 IP 环回地址的 Windows 运行时应用程序将无法接收任何传入数据包。

在您的情况下,如果您只是想测试 UWP 应用程序是否可以成功地向您的 python 订阅者发送消息。你可以在另一台机器上运行 UWP 应用。我使用您的代码制作了一个 UWP 应用程序来发送消息并将控制台应用程序制作为在不同机器上运行的订阅者。控制台应用程序可以接收消息。

请注意,由于您的 UWP 应用需要在运行时访问网络,您需要在 Package.appxmanifest 文件中启用 Netwrok 功能(Internet(Client)Internet(Client &amp; Server)Private Networks(Client &amp; Server))。

【讨论】:

  • 嗨,谢谢,所以没有办法在同一台机器上解决这个问题吗? (“绕过”是指在同一台机器上从 UWP 和 python 发送消息)。
  • @Izik 没办法。
猜你喜欢
  • 2020-06-21
  • 2022-09-24
  • 2017-08-17
  • 2017-05-03
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多