Ich habe zwei Windows UWP Apps. Einer von ihnen (der "Server") läuft auf einem Raspberry Pi 2 unter Windows IoT (10586.0). Der andere (der "Client") läuft auf jedem Windows 10-Gerät im selben Netzwerk.Netzwerkverbindung mit UWP Apps
Ich möchte, dass die Apps miteinander "sprechen". Für den Moment möchte ich einfach String vom Client zum Server senden. Später sollten serialisierte Daten über das Netzwerk übertragen werden.
Dies ist der Code für den Server App:
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();
}
}
}
Wie Sie sehen, ich bin auf dem gleichen Host eine Netzwerkverbindung mit den gleichen App Aufbau und die Zeichenfolge „Test Selbst App“ senden. Das funktioniert schon seit geraumer Zeit in Ordnung, aber nach einer Weile habe ich den Fehler:
Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll
WinRT information: No connection could be made because the target machine actively refused it.
Also, das ist meine erste Frage: Was ist dieser Fehler und wie kann ich dieses Problem beheben?
Die andere Sache ist: Ich kann keine Netzwerkverbindung zwischen dem Server und dem Client herstellen. Ich weiß nicht, was ich falsch mache. Dies ist der Code des "Client":
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)
}
}
}
}
Wenn ich auf dem btn_Send klicken, erhalte ich die Fehlermeldung
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.
und
A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)
Was mache ich falsch? Vielleicht sollte ich sagen, dass ich relativ neu in der Programmierung von Netzwerkverbindungen, Sockets etc. bin.
Danke für jede Hilfe!
Haben Sie verändert den Hostnamen etwas Vernünftiges ausgeführt werden soll? Hast du deine Firewall-Regeln überprüft? –
Ich habe es auch versucht mit der Firewall ausgeschaltet. Ich habe "127.0.0.1" als Hostname versucht, ich habe auch "minwinpc" (der Name des RPi im LAN) ausprobiert, aber nichts schien zu funktionieren. – drummercrm
Hast du es mit der IP-Adresse deines Pi versucht? –