【问题标题】:Network connection with UWP Apps与 UWP 应用程序的网络连接
【发布时间】:2016-07-28 07:25:43
【问题描述】:

我有两个 Windows UWP 应用。其中一个(“服务器”)在 Windows IoT (10586.0) 上的 Raspberry Pi 2 上运行。另一个(“客户端”)在同一网络中的任何 Windows 10 设备上运行。

我想要的是让应用程序相互“交谈”。目前我只想将简单的字符串从客户端发送到服务器。稍后,序列化的数据应该通过网络传输。

这是服务器应用程序的代码:

namespace LCARSHomeAutomation
{
/// <summary>
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
/// </summary>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        try {
            EstablishNetworking();
            txb_Events.Text += "Server Running";
        }catch (Exception ex)
        {
            txb_Events.Text += ex.Message;
        }

        
    }

    private async void EstablishNetworking()
    {
        await StartListener();
    }

    public async Task StartListener()
    {
        StreamSocketListener listener = new StreamSocketListener();
        listener.ConnectionReceived += OnConnection;

        listener.Control.KeepAlive = true;

        try
        {
            await listener.BindServiceNameAsync("5463");
            
        }
        catch (Exception ex)
        {
            if (SocketError.GetStatus(ex.HResult) == SocketErrorStatus.Unknown)
            {
                throw;
            }
            //Logs.Add(ex.Message);
            txb_Events.Text += ex.Message;
        }

    }

    private async void OnConnection(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
    {
        Stream inStream = args.Socket.InputStream.AsStreamForRead();
        StreamReader reader = new StreamReader(inStream);
        string request = await reader.ReadLineAsync();

        await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                                   () =>
                                   {
                                        // Your UI update code goes here!
                                        txb_Events.Text += (String)request;
                                   });


    }

    private async Task ConnectSocket()
    {
        StreamSocket socket = new StreamSocket();

        socket.Control.KeepAlive = false;

        HostName host = new HostName("localhost");

        try
        {
            await socket.ConnectAsync(host, "5463");

            Stream streamOut = socket.OutputStream.AsStreamForWrite();
            StreamWriter writer = new StreamWriter(streamOut);
            string request = "Test Self App \n";
            await writer.WriteLineAsync(request);
            await writer.FlushAsync();

            socket.Dispose();
        }
        catch (Exception ex)
        {
            txb_Events.Text += ex.Message;
            //Logs.Add(ex.Message)
        }


    }

    private async void btn_Send_Click(object sender, RoutedEventArgs e)
    {
        await ConnectSocket();
    }
    
}
}

如您所见,我正在与同一主机上的同一应用程序建立网络连接,并发送字符串“Test Self App”。这在很长一段时间内都可以正常工作,但过了一段时间我得到了错误:

抛出异常:mscorlib.ni.dll 中的“System.Runtime.InteropServices.COMException”

WinRT 信息:由于目标计算机主动拒绝,无法建立连接。

所以,这是我的第一个问题:这是什么错误,我该如何解决?

另一件事是:我无法在服务器和客户端之间建立网络连接。我不知道,我做错了什么。这是“客户端”的代码:

namespace LCARSRemote
{
/// <summary>
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
/// </summary>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    private async void btn_Send_Click(object sender, RoutedEventArgs e)
    {
        StreamSocket socket = new StreamSocket();

        HostName host = new HostName("localhost"); //Replace with coorect hostname when running on RPi

        try
        {
            try {
                await socket.ConnectAsync(host, "5463");
            }
            catch(Exception ex)
            {
                txb_Events.Text += ex.Message;
            }

            Stream streamOut = socket.OutputStream.AsStreamForWrite();
            StreamWriter writer = new StreamWriter(streamOut);
            string request = "Remote App Test";
            await writer.WriteLineAsync(request);
            await writer.FlushAsync();

            socket.Dispose();

        }
        catch (Exception ex)
        {
            txb_Events.Text += ex.Message;
            //Logs.Add(ex.Message)
        }

    }
}
}

当我点击 btn_Send 时,我收到错误消息

连接尝试失败,因为连接的一方在一段时间后没有正确响应,或者连接的主机没有响应,建立连接失败。

在意外的时间调用了一个方法。 (来自 HRESULT 的异常:0x8000000E)

我做错了什么?也许我应该说,我在编程网络连接、套接字等方面相对较新。

感谢您的帮助!

【问题讨论】:

  • 您是否将主机名更改为合理的名称?你检查过你的防火墙规则吗?
  • 我也试过关闭防火墙。我尝试将“127.0.0.1”作为主机名,我还尝试了“minwinpc”(局域网中 RPi 的名称),但似乎没有任何效果。
  • 你试过你的 Pi 的 IP 地址吗?
  • 你没有这么说,你的代码说的是 localhost (这显然不起作用,因为客户端和服务器位于不同的主机上);你说你已经尝试了本地主机的 IP (127.0.0.1) 和主机名,但不是实际的 IP。您是否真的尝试过在同一主机上运行您的代码?
  • 我尝试了两种方法:服务器在 RPi 上运行,客户端在 PC 上运行,服务器和客户端在 PC 上运行。根据场景,我更改了客户端代码中的主机名。我尝试使用 RPi 的主机名以及 RPi 的 IP 地址。当我尝试从服务器向自身发送消息时(参见代码,Task ConnectSocket),有时我可以点击一下,然后我收到消息,“机器主动拒绝”连接。

标签: c# sockets networking win-universal-app windows-10-iot-core


【解决方案1】:

您应该尝试在 UWP 中使用 StreamSocket API。此示例 repo 包含服务器和客户端代码:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/StreamSocket

在意外的时间调用了一个方法。 (HRESULT 异常:0x8000000E)

当我尝试连续两次调用ConnectAsync 时发生此错误,我认为您可以检查您的逻辑或调试以确认您的情况。

【讨论】:

  • 我查看了这些示例,但它们并没有真正的帮助。错误仍然存​​在。我也尝试使用 DataWriter / DataWriter 而不是 StreamReader / -Writer(如上面的示例),但它也没有工作。
【解决方案2】:

第一个错误

抛出异常:“System.Runtime.InteropServices.COMException”在 mscorlib.ni.dll

WinRT 信息:无法建立连接,因为目标 机器主动拒绝了。

这是因为套接字仍然通过先前的请求打开并且尚未关闭。所以抓住这个错误并尝试重新连接。

连接尝试失败,因为连接方没有 一段时间后正确响应,或建立连接 失败,因为连接的主机没有响应。

这是因为服务器和客户端在同一台机器上,我遇到了同样的问题,据说你可以从提升的命令提示符运行

checknetisolation loopbackexempt -d -n= {package family} 

解决它。

这个解决方案对我不起作用。因此,您的服务器必须在 pi 上运行,客户端必须在桌面 PC 上运行,Windows 10 UWP 才能连接到它。 据我所知,Windows 10 不允许 UWP 应用程序的环回连接。

如果你真的想运行一个套接字服务器/网络服务器 node.js windows 通用应用程序可能是一个好方法

https://ms-iot.github.io/content/en-US/win10/samples/NodejsWU.htm

RestUP  https://github.com/tomkuijsten/restup

【讨论】:

    【解决方案3】:

    根据您谈论的数据量和最终用例是什么,亚马逊的 AWS IoT 平台可能值得一看。出于多种原因,这很酷。具体来说,我喜欢目标设备在传输时可以离线。

    第一年免费(250,000 条消息),之后每百万条消息 5 美元。每 512 字节块计为 1 个消息信用。

    【讨论】:

    • 这对我来说是不可能的解决方案,因为我希望应用程序即使在没有互联网连接的情况下也能相互通信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2012-07-30
    • 1970-01-01
    • 2020-03-20
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多