【发布时间】: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