c# - 与 UWP 应用程序的网络连接

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

我有两个 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”。这在很长一段时间内都可以正常工作,但过了一会儿我得到了错误:

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

WinRT information: No connection could be made because the target machine actively refused it.

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

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

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 时,我收到错误消息

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

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

感谢您的帮助!

最佳答案

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

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

当我尝试连续两次调用 ConnectAsync 时,我发生了这个错误,我想你可以检查你的逻辑或调试以确认你的情况。

关于c# - 与 UWP 应用程序的网络连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36475752/

相关文章:

c# - 使用套接字的简单 Http 代理 : Questions

networking - 如何在不使用 NTP、PTP 的情况下计算单向数据包延迟

linux - 将 Linux 系统时钟同步到 Windows NTP 服务

c# - 从 iPhone native 应用程序使用 Xamarin 库

C# 找不到类型或命名空间名称

c# - 安装 log4net 多个项目

C - TCP 校验和(使用原始套接字)——如何获取 IP 地址

c - 连续监听端口并将数据转储到文本文件

linux - Docker容器mac地址变化

c# - 使用 JSON 和 MultipartEntity 将图像从 Android 发送到 WCF