C# 与UWP应用程序的网络连接
我有两个Windows UWP应用程序。其中一个(服务器)在Windows IoT(10586.0)上的Raspberry Pi 2上运行。另一个(客户端)在同一网络中的任何Windows 10设备上运行 我想要的是让应用程序彼此“对话”。目前,我只想将简单字符串从客户端发送到服务器。以后,序列化数据应该通过网络传输 这是服务器应用程序的代码:C# 与UWP应用程序的网络连接,c#,sockets,networking,win-universal-app,windows-10-iot-core,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, di
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();
}
}
}
名称空间LCARSHomeAutomation
{
///
///在这段时间里,我们的内心世界充满了希望。
///
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
试一试{
建立网络();
txb_Events.Text+=“服务器正在运行”;
}捕获(例外情况除外)
{
txb_Events.Text+=ex.消息;
}
}
专用异步网络()
{
等待惊吓者();
}
公共异步任务侦听器()
{
StreamSocketListener listener=新的StreamSocketListener();
listener.ConnectionReceived+=OnConnection;
listener.Control.KeepAlive=true;
尝试
{
等待listener.BindServiceNameAsync(“5463”);
}
捕获(例外情况除外)
{
if(SocketError.GetStatus(ex.HResult)==SocketErrorStatus.Unknown)
{
投掷;
}
//日志。添加(例如消息);
txb_Events.Text+=ex.消息;
}
}
连接上的专用异步无效(StreamSocketListener发送方、StreamSocketListenerConnectionReceivedEventArgs参数)
{
Stream inStream=args.Socket.InputStream.AsStreamForRead();
StreamReader=新的StreamReader(流内);
string request=wait reader.readlinesync();
等待Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
//你的UI更新代码在这里!
txb_Events.Text+=(字符串)请求;
});
}
专用异步任务ConnectSocket()
{
StreamSocket套接字=新的StreamSocket();
socket.Control.KeepAlive=false;
主机名主机=新主机名(“本地主机”);
尝试
{
等待socket.ConnectAsync(主机,“5463”);
streamOut=socket.OutputStream.AsStreamForWrite();
StreamWriter writer=新StreamWriter(streamOut);
string request=“测试自我应用程序\n”;
等待writer.WriteLineAsync(请求);
等待writer.FlushAsync();
socket.Dispose();
}
捕获(例外情况除外)
{
txb_Events.Text+=ex.消息;
//添加日志(例如消息)
}
}
私有异步无效btn\u发送\u单击(对象发送方,路由目标)
{
等待ConnectSocket();
}
}
}
如您所见,我正在同一主机上与同一应用程序建立网络连接,并发送字符串“Test Self app”。这在相当长的一段时间内运行良好,但过了一段时间后,我发现错误:
引发异常:mscorlib.ni.dll中的“System.Runtime.InteropServices.COMException”
WinRT信息:无法建立连接,因为目标计算机主动拒绝连接
所以,这是我的第一个问题:这个错误是什么?我如何修复它
另一件事是:我无法在服务器和客户端之间建立网络连接。我不知道,我做错了什么。这是“客户机”的代码:
命名空间lcarsmote
{
///
///在这段时间里,我们的内心世界充满了希望。
///
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
}
私有异步无效btn\u发送\u单击(对象发送方,路由目标)
{
StreamSocket套接字=新的StreamSocket();
HostName host=new HostName(“localhost”);//在RPi上运行时替换为coorrect HostName
尝试
{
试一试{
等待socket.ConnectAsync(主机,“5463”);
}
捕获(例外情况除外)
{
txb_Events.Text+=ex.消息;
}
streamOut=socket.OutputStream.AsStreamForWrite();
StreamWriter writer=新StreamWriter(streamOut);
string request=“远程应用程序测试”;
等待writer.WriteLineAsync(请求);
等待writer.FlushAsync();
socket.Dispose();
}
捕获(例外情况除外)
{
txb_Events.Text+=ex.消息;
//添加日志(例如消息)
}
}
}
}
当我点击btn_发送时,我会收到错误消息
由于连接方在一段时间后没有正确响应,连接尝试失败;或者由于连接的主机未能响应,建立的连接失败
及
在意外时间调用了一个方法。(HRESULT的例外:0x800000E)
我做错了什么?也许我应该说,我在编程网络连接、套接字等方面相对较新
谢谢你的帮助 您应该尝试在UWP中使用
StreamSocket
API。此示例repo包含服务器和客户端代码:
在意外时间调用了一个方法。(HRESULT的例外:0x800000E)
这个错误发生在我尝试连续两次调用
ConnectAsync
时,我认为您可以检查您的逻辑或调试以确认您的情况。根据您所谈论的数据量和最终用例,Amazon的AWS物联网平台可能会有所不同
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)
}
}
}
}
checknetisolation loopbackexempt -d -n= {package family}
https://ms-iot.github.io/content/en-US/win10/samples/NodejsWU.htm
RestUP https://github.com/tomkuijsten/restup