Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 10.02.12 15:54 
Hallo mal wieder,

nun schreibe ich wie versprochen auch das Tutorial zum TcpClient.

Ich habe im Anhang ein Projekt als Beispiel das ausführlich erklärt ist.

Synchrones Verfahren
Bei dieser Methode erzeugen wir einfach eine neue Instanz der TcpClient-Klasse und senden mittels Connect() eine Verbindungsanfrage zu einem beliebigen erreichbaren PC. Unser Hauptthread blockiert dann so lange, bis die Verbindung zustande kommt, hier ist kein Timeout möglich.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 public TcpClient ConnectSync(IPAddress ip, int port)
        {
            TcpClient client = new TcpClient();
            client.Connect(ip, port);             //Hier blockiert der Thread
            return client;
        }


Asynchrones Verfahren
In dieser Methode wird unser Hauptthread und somit die Form, etc. nicht blockiert.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        public void ConnectAsync(IPAddress ip, int port)
        {
            TcpClient client = new TcpClient();     
            client.BeginConnect(ip, port, ConnectAsyncCallback, client);
        }

        private void ConnectAsyncCallback(IAsyncResult state)
        {
            TcpClient client = (TcpClient)state.AsyncState;
            client.EndConnect(state);
            OnConnected.Invoke(client); //Diese Zeile wird im Projekt im Anhang deutlich
        }

Das Neue hier ist die BeginnConnect()-Methode, die unseren Hintergrundthread startet und die Verbindung asynchron abwickelt.
Als Parameter fordert sie zuerst einmal die IP-Addresse und den Port des Remotehosts (unseres Gegenübers).
AsyncCallback callback (hier: "ConnectAsyncCallback") ist eine Methode die den Parameter IAsyncResult zwingend verlangt. Diese Methode wird aufgerufen, wenn die Gegenstelle die Verbindung angenommen hat.
Als letzten Parameter haben wir dann noch unser IAsyncResult dass hier vom Typ TcpClient ist, also unser "client". Dieser muss hier übergeben werden, da er später im Callback wieder verwendet werden muss.
Wäre "client" in unserer Klasse und nicht in der Methode instanziiert worden, könnte man im Callback direkt darauf zugreifen und somit könnte man bei BeginnConnect() als IAsyncResult auch Null nehmen.
Wichtig ist zum Schluss noch das abschließen der Verbindung mit client.EndConnect(state).

In der letzten Zeile habe ich noch ein Event eingebaut, dass auslöst, wenn der Verbindungsaufbau abgeschlossen ist. In meinem Projekt ist es nochmal deutlicher sichtbar. Ich verwende dieses Event, um in einer anderen Klasse den Clienten zu übernehmen, sobald er verbunden ist.

Bei Fragen natürlich Posten.

Ich hoffe das Tut war hilfreich.
Einloggen, um Attachments anzusehen!