Ich habe eine TCP-Server-Anwendung programmiert, wo ich eingehende Verbindungen an einem dedizierten Port abhören kann. Damit kann ich ein "verbundenes" Ereignis bekommen und dann Daten empfangen (nur einmal).UWP TCP Daten kontinuierlich empfangen
Wie kann ich kontinuierlich Daten vom Port empfangen (und vielleicht auch feststellen, ob der Client noch angeschlossen ist)?
Ich habe ein NodeMCU (Arduino-basiertes) System angeschlossen, das jede Temperatur über die TCP-Verbindung sendet.
Starten und Stoppen des Servers über einen Kippschalter in der Benutzeroberfläche:
public async Task<bool> StartListeningAsync()
{
if (TCPSocket == null)
{
TCPSocket = new StreamSocketListener();
TCPSocket.ConnectionReceived += LocalSocketConnectionReceived;
await TCPSocket.BindServiceNameAsync(CommunicationPort);
return true;
}
return false;
}
public async Task<bool> StopListening()
{
if (connectedSocket != null)
{
connectedSocket.Dispose();
connectedSocket = null;
}
if (TCPSocket != null)
{
await TCPSocket.CancelIOAsync();
TCPSocket.ConnectionReceived -= LocalSocketConnectionReceived;
TCPSocket.Dispose();
TCPSocket = null;
return true;
}
return false;
}
Ereignis, das eine neue Verbindung behandelt und Empfangen von Daten:
private async void LocalSocketConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
if (connectedSocket != null)
{
connectedSocket.Dispose();
connectedSocket = null;
}
connectedSocket = args.Socket;
await textBox_send.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() =>
{
textBox_send.IsEnabled = true;
txtConnected.Text = "Client Connected";
});
using (var reader = new DataReader(args.Socket.InputStream))
{
await readTCPDataAsync(reader);
}
}
private async Task readTCPDataAsync(DataReader reader)
{
reader.InputStreamOptions = InputStreamOptions.None;
// Read the length of the payload that will be received.
byte[] payloadSize = new byte[(uint)BitConverter.GetBytes(0).Length];
await reader.LoadAsync((uint)payloadSize.Length);
reader.ReadBytes(payloadSize);
// Read the payload.
int size = BitConverter.ToInt32(payloadSize, 0);
//size = 2;
byte[] payload = new byte[size];
await reader.LoadAsync((uint)size);
reader.ReadBytes(payload);
string data = Encoding.ASCII.GetString(payload);
}
Dieser Code funktioniert perfekt auf die Daten einmal erhalten Die Verbindung ist hergestellt.
Ich denke an eine Lösung, um ein Ereignis zu erhalten, sobald neue Daten im Eingabepuffer sind und dann die Daten verarbeiten.
ich arround jetzt mit diesem Thema beschäftigt und Empfang der Nachrichten arbeitet mit dieser Methode gut. Wenn ich die Verbindung/den Server schließe, bekomme ich immer eine Ausnahme "System.ObjectDisposedException" in der Zeile "awarn reader.LoadAsync ((uint) payloadSize.Length);' da der Input Socket geschlossen wurde. Wie kann ich die while-Schleife davon abhalten, den Port anzuhören? – Christoph