Ich erstelle einen Windows-Dienst, der TCP-Verbindungen akzeptiert, Daten verarbeitet, die an den Server gesendet werden, und gibt dann eine Nachricht zurück, die besagt, dass der Vorgang abgeschlossen ist. Es gibt mehrere Clients, die sich mit dem Dienst verbinden werden und diese Nummer wächst. Um diese Nachrichten zu verarbeiten, dachte ich, dass die Verwendung einer nicht blockierenden Struktur ideal wäre. Von anfänglichen Suchen, schien die BeginAcceptTcpClient
, was ich suchte. Ich suchte at this tutorial, um eine Probe zu bekommen, aber ich habe ein paar Fragen, wie das funktioniert. Mein Code, den ich auf diesem Beispiel basiert, ist unten.Wie funktioniert der begin/async tcplistener
- In der
OnClientConnected
Funktion, warum es notwendig istWaitForClients
wieder anrufen? Warum hört der Zuhörer nicht immer zu? - Was passiert, wenn eine andere Verbindung versucht wird, bevor
WaitForClients
erneut aufgerufen wird? Ich weiß, es ist die erste Aussage in derOnClientConnected
, aber es könnte zwei Verbindungen sein, die "zur gleichen Zeit" passieren - Ich kann nicht wirklich verstehen, wie dies in Bezug auf Multithreading funktioniert. Wenn ich 10 Simulationsverbindungen hatte, sieht es so aus, als würde die erste
OnClientConnected
eingeben und dannWaitForClients
anrufen, was dann erlauben wird, dass eine andere Verbindung behandelt wird. Dies scheint eine Art Verbindung mit einer Verbindung zu einer Zeit zu sein, anstatt mehrere Threads zu haben, die viel Verkehr bewältigen können.
public class DeviceListener
{
private TcpListener listener = null;
public DeviceListener()
{
listener = new TcpListener(1001);
}
public void StartListener()
{
listener.Start();
//TODO: Log listening started here
WaitForClients();
}
private void WaitForClients()
{
listener.BeginAcceptTcpClient(OnClientConnected, null);
}
private void OnClientConnected(IAsyncResult asyncResult)
{
WaitForClients();
TcpClient client = listener.EndAcceptTcpClient(asyncResult);
if(client != null)
{
//TODO: Log connected
HandleClientRequest(client);
}
}
private void HandleClientRequest(TcpClient client)
{
//Code to process client request
}
}