与UWP应用程序的网络连接

3
我有两个 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”。这段时间内工作得很好,但是过了一段时间后,我会收到错误:

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

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)
我做错了什么?也许我应该说,我在编程网络连接、套接字等方面相对较新。
谢谢任何帮助!

你把主机名改成合理的了吗?你检查过防火墙规则了吗? - Rowland Shaw
我也尝试关闭防火墙。我尝试使用“127.0.0.1”作为主机名,我还尝试了LAN中RPi的名称“minwinpc”,但似乎都没有起作用。 - drummercrm
你尝试过使用树莓派的IP地址了吗? - Rowland Shaw
你没有说过这个,你的代码中写的是localhost(显然不会工作,因为客户端和服务器在不同的主机上);你说你已经尝试过localhost的IP地址(127.0.0.1)和主机名,但没有尝试实际的IP地址。你是否真的尝试过在同一台主机上运行你的代码? - Rowland Shaw
我尝试了两种方式:在树莓派上运行服务器,PC上运行客户端,以及在PC上同时运行服务器和客户端。根据不同的情况,我更改了客户端代码中的主机名。我尝试使用树莓派的主机名和IP地址。当我尝试从服务器向自身发送消息(请参见代码,任务ConnectSocket)时,我可以点击相当长的时间,然后我会收到消息,即“机器主动拒绝”连接。 - drummercrm
3个回答

1

第一个错误

异常抛出:'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

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

这是因为套接字仍然与先前的请求保持打开状态,尚未关闭。因此捕获此错误并尝试重新连接。

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

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

checknetisolation loopbackexempt -d -n= {package family} 

解决它。

这个解决方案对我没有用。所以你的服务器必须在树莓派上运行,客户端必须在你的桌面PC上运行,才能让Windows 10 UWP连接到它。 据我所知,Windows 10不允许UWP应用程序进行回环连接。

如果你真正想运行一个socket服务器/ web服务器node.js,Windows通用应用程序可能是一个好方法。

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

or

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

1

我看了一下那些例子,但它们并没有真正帮到我。错误仍然存在。我还尝试使用DataWriter / DataWriter而不是StreamReader / -Writer(如上面的例子),但它也没有起作用。 - drummercrm

0

根据你所处理的数据量和最终使用情况,亚马逊的AWS IoT平台可能是值得考虑的选择。它有很多很酷的功能。特别是我喜欢目标设备可以在传输时处于离线状态。

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


这对我来说不是可行的解决方案,因为我希望应用程序在没有互联网连接时也能相互通信。 - drummercrm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接