我有两个 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/