Ausführliches TCP und UDP Tutorial
OK zu allererst ein TCP Client und Server, der eine Verbindung annehmen kann.
Der TCP Client:
OK jetzt werde ich mal den Code erläutern(Ist anders zum Source Code oben! Hier werden nur die Haupt Sachen erklärt):
Wir brauchen zu aller erst einmal einen Client. Um diesen, benutzen zu können müssen wir ersteinmal die Sockets Klasse importieren. Damit wir auch die Streams benutzen können werden wir die IO Klasse gleich mit importieren:
Wir erstellen jetzt einen TCP Client und nebenbei auch die Streams zum senden und zum empfangen der Daten:
OK. Jetzt machen wir einen Sub indem der Client versucht eine Verbindung mit dem Server herzustellen. Wir nehmen mal die IP Addresse "192.168.111.17" und den Port 4000. Danach kommt der Code um zu schauen ob der Client sich erflogreich Verbinden konnte. Wenn ja, wird auf einen nächsten Sub verwiesen. Wenn nein, wird eine MSGBOX ausgeworfen:
So jetzt wird der SUB Deklare_Streams() aufgerufen. Indem werden die Streams, die wir oben schon deklariert haben, auf den Client verwiesen, damit wir Daten senden und empfangen können:
Jetzt machen wir noch 2 Subs. Einer zum senden der Daten und einen zum Empfangen. Diese bräuchte man nicht unbedingt, da man den Code auch direkt in den Main Sub schreiben könnte. Aber es ist Übersichtlicher:
Jetzt sind wir schon fast am Ende. Jeder kann jetzt daten senden oder empfangen in einer beliebigen Reinfolge. Ich nehmen jetzt 1 mal senden und 1 mal empfangen. Diese werden in dem Button1_click Sub stehen. Also wenn Button1 angeklickt wird, wird ein Stream gesendet und eine Empfangen.
Und ganz zum Schluss wenn man die Verbindung trennen will:
So ich hoffe der Client ist klar. Jetzt muss man nur noch alles für sein Projekt anpassen.
Der Server (Für eine Verbindung):
Ok. Jetzt erläutere ich auch den Server Code. Zu aller erst einmal den unterschied zwischen diesem Server und einem Multi Server.
Dieser Server kann nur einen Client nach dem anderen vornehmen. Wenn der Client sich eine Stunde mit dem Server Verbindet, kann der nächste Client erst danach angenommen werden. Damit wir auch dieses Problem lösen, werde ich weiter unten den Multi Server erklären.
Zu aller erst müssen wir wieder die IO und die Socket Klasse importieren. Die Net Klasse, inder auch die Socket drinnen ist, importiere ich gleich mit, damit ich die IPendpoint benutzten kann:
So jetzt werden wir mal alle unsere Variablen deklarieren:
Jetzt mal langsam^^. Für Diejenigen denen das jetzt zu schnell mit den Variablen ging:
Das müsste klar sein, da wir das selbe schon oben im Client benutzt haben. Wieder zum empfangen und zum senden benötigen wir diese 3 Streams.
Das ist unser Server der nichts anderes tut als eine Clientverbindung anzunehmen.
Wichtig: Der TCPListener kann keine Daten Versenden oder Empfangen!!! Er nimmt nur ausstehende Verbidnungen an! Um jedoch Anworten zu senden oder zu empfangen, benötigen wir einen Client, denn dieser ist zum senden und emfangen da!
Wie oben beschrieben benötigen wir diesen Client um den verbundenen Client zu Anworten und deren Streams auch zu empfangen.
Diese Variable ist sowas wie die Addresse wo der der Server listenen soll. 'IPAddress.Any' bedeutet nichts anderes, dass er, egal welche ip, jede Verbidnung annimmt, welche auf dem Port 4000 eintrifft.
Wichitg: In diesem Thread wird der ganze Server laufen. Wenn man den Server ohne Thread macht, dann bleibt die ganze Form bei diesem Code hängen 'Server.AcceptTCPClient'. Also nicht Vergessen, wenn man nicht will, dass seine Form sich Aufhängt^^.
OK. Jetzt werden wir in dem Sub Event 'Form1_load' den Thread 'mainthread' eine Adresse geben und dann starten:
So der Thread startet und führt den Sub 'mainserver' aus. Jetzt erst mal der ganze sub und danach die Erklärung:
Ojeje: Ihre Nachricht ist zu lang. Es stehen maximal 15 000 Zeichen zur Verfügung.
OK wenn das Forum das so will, folgt der Rest des Tuts unten.^^
Der TCP Client:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Public Class Form1
- 'Variablen:
- Dim stream As NetworkStream
- Dim streamw As StreamWriter
- Dim streamr As StreamReader
- Dim Client As New TcpClient
- Dim IP As String = "192.168.111.17"
- Dim Port As Integer = 4000
- Dim loginname As String = "abc" ' Diese Variable ist nicht Pflicht! Aber nützlich für ein Chatprogram...
- '_________________
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- 'Button1 wird geclickt
- Client.Connect(IP, Port) 'Client verbindet sich mit IP: 192.168.111.17 und Port 4000
- If Client.Connected Then
- stream = Client.GetStream ' Stream wird auf Client verwiesen
- streamw = New StreamWriter(stream) ' Stream zum Senden wird deklariert
- streamr = New StreamReader(stream) ' Stream zum Empfangen wird deklariert
- login() ' Sub Login
- Else
- MsgBox("Verbidnung konnte nicht mit " & IP & " aufgebaut werden!")
- End If
- End Sub
- Sub client_send(ByVal text As String)
- streamw.WriteLine(text)
- streamw.Flush()
- End Sub
- Function client_recieve() As String
- client_recieve = streamr.ReadLine
- End Function
- ' Nach der erfolgreichen verbindung mit der IP und dem Port wird dieser Sub aufgerufen:
- Sub login()
- Try
- 'Hier kann man jetzt empfangen wie man will.
- 'Auch die reinfolge ist egal.
- 'Ich benutzte hier 1 mal senden, einmal empfangen und dann wieder von vorne...
- 'Man kann aber auch 2 mal Empfangen und 2 mal Senden nehmen oder...... wies einem so bekommt^^
- client_send("onl " & loginname)
- If client_recieve() = "ok" Then 'Oder sonst irgend was. Ist nur ein Beispiel für einen Login
- Send_irgendwas() ' Hier kann gehts zum nächsten sub um irgend welche Daten zu versenden...
- Else
- 'Hier den Code wenn das Anmelden Fehlgeschlagen hat. Goto oder einen Sub aufrufen oder....
- Exit Sub ' Versteht sich von Selbst...
- End If
- Catch
- ' Hier kann man eine Error Message ausgeben oder eine Automatische Fehlerbehebung machen,....
- End Try
- End Sub
- Sub Send_irgendwas()
- client_send("Irgendwas")
- If client_recieve() = "Auch wieder irgendwas..." Then
- '.....
- Else
- '....
- End If
- ' Und soo weiter...
- ' Und wenn man die verbidnugn schliesen will, dann einfach:
- Client.Close()
- ' Nichts einfacher als das!^^
- End Sub
- End Class
OK jetzt werde ich mal den Code erläutern(Ist anders zum Source Code oben! Hier werden nur die Haupt Sachen erklärt):
Wir brauchen zu aller erst einmal einen Client. Um diesen, benutzen zu können müssen wir ersteinmal die Sockets Klasse importieren. Damit wir auch die Streams benutzen können werden wir die IO Klasse gleich mit importieren:
Wir erstellen jetzt einen TCP Client und nebenbei auch die Streams zum senden und zum empfangen der Daten:
OK. Jetzt machen wir einen Sub indem der Client versucht eine Verbindung mit dem Server herzustellen. Wir nehmen mal die IP Addresse "192.168.111.17" und den Port 4000. Danach kommt der Code um zu schauen ob der Client sich erflogreich Verbinden konnte. Wenn ja, wird auf einen nächsten Sub verwiesen. Wenn nein, wird eine MSGBOX ausgeworfen:
VB.NET-Quellcode
- sub Connect_to_Server(byval ip as string, byval port as integer)
- Client.Connect(IP, Port) 'Client verbindet sich mit IP: 192.168.111.17 und Port 4000
- If Client.Connected Then
- Deklare_Streams() ' Sub Deklare_Streams()
- Else
- MsgBox("Verbidnung konnte nicht mit " & IP & " aufgebaut werden!")
- End If
- end sub
So jetzt wird der SUB Deklare_Streams() aufgerufen. Indem werden die Streams, die wir oben schon deklariert haben, auf den Client verwiesen, damit wir Daten senden und empfangen können:
Jetzt machen wir noch 2 Subs. Einer zum senden der Daten und einen zum Empfangen. Diese bräuchte man nicht unbedingt, da man den Code auch direkt in den Main Sub schreiben könnte. Aber es ist Übersichtlicher:
VB.NET-Quellcode
- Sub client_send(ByVal text As String) ' Sub zum senden der Daten 'text'
- streamw.WriteLine(text)
- streamw.Flush() ' Achtung! Flush darf nie vergessen werden, da sonst die Daten nicht gesendet werden.
- End Sub
- Function client_recieve() As String ' Sub zum empfangen der Daten.
- client_recieve = streamr.ReadLine
- End Function
Jetzt sind wir schon fast am Ende. Jeder kann jetzt daten senden oder empfangen in einer beliebigen Reinfolge. Ich nehmen jetzt 1 mal senden und 1 mal empfangen. Diese werden in dem Button1_click Sub stehen. Also wenn Button1 angeklickt wird, wird ein Stream gesendet und eine Empfangen.
VB.NET-Quellcode
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- client_send("HALLO") ' Dieser Stream geht zum Server.
- msgbox (client_recieve()) 'Und hier wird der empfangene Stream, der vom Server als Antwort gesendet wurde, in einer MSGBOX ausgegeben.
- end sub
Und ganz zum Schluss wenn man die Verbindung trennen will:
So ich hoffe der Client ist klar. Jetzt muss man nur noch alles für sein Projekt anpassen.
Der Server (Für eine Verbindung):
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Imports System.Net
- Public Class Form1
- 'Variablen:
- Dim stream As NetworkStream
- Dim streamw As StreamWriter
- Dim streamr As StreamReader
- Dim Server As TcpListener
- Dim client As New TcpClient
- Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)
- Dim mainthread As Threading.Thread
- '______________
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- mainthread = New Threading.Thread(AddressOf mainserver)
- mainthread.Start()
- End Sub
- Sub mainserver()
- Try
- Server = New TcpListener(ipendpoint)
- Server.Start()
- client = Server.AcceptTcpClient
- stream = client.GetStream
- streamr = New StreamReader(stream)
- streamw = New StreamWriter(stream) ' Müsste eigentlich alles Klar sein.
- While True
- Select Case streamr.ReadLine
- Case "onl" ' und so weiter eigentlich müsste es heißen select case mid(streamr.readline,1,3) Aber da des ja vielen zu Kompiziert ist lass ich das mal weg^^
- streamw.WriteLine("ok") ' Achtung! ist nicht Vollständig!
- streamw.Flush() ' Code muss angepasst werden.....
- Case "...." ' ......
- Case "logoff" '........
- End Select
- End While
- Catch
- ' Hier wieder eine Fehler behandlung und ein neuen Versuch den Server zu starten...
- End Try
- End Sub
- Private Sub Form1__close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
- server.close
- Try
- mainthread.Abort()
- Catch
- End Try
- End Sub
- End Class
Ok. Jetzt erläutere ich auch den Server Code. Zu aller erst einmal den unterschied zwischen diesem Server und einem Multi Server.
Dieser Server kann nur einen Client nach dem anderen vornehmen. Wenn der Client sich eine Stunde mit dem Server Verbindet, kann der nächste Client erst danach angenommen werden. Damit wir auch dieses Problem lösen, werde ich weiter unten den Multi Server erklären.
Zu aller erst müssen wir wieder die IO und die Socket Klasse importieren. Die Net Klasse, inder auch die Socket drinnen ist, importiere ich gleich mit, damit ich die IPendpoint benutzten kann:
So jetzt werden wir mal alle unsere Variablen deklarieren:
Jetzt mal langsam^^. Für Diejenigen denen das jetzt zu schnell mit den Variablen ging:
Das müsste klar sein, da wir das selbe schon oben im Client benutzt haben. Wieder zum empfangen und zum senden benötigen wir diese 3 Streams.
Das ist unser Server der nichts anderes tut als eine Clientverbindung anzunehmen.
Wichtig: Der TCPListener kann keine Daten Versenden oder Empfangen!!! Er nimmt nur ausstehende Verbidnungen an! Um jedoch Anworten zu senden oder zu empfangen, benötigen wir einen Client, denn dieser ist zum senden und emfangen da!
Wie oben beschrieben benötigen wir diesen Client um den verbundenen Client zu Anworten und deren Streams auch zu empfangen.
Diese Variable ist sowas wie die Addresse wo der der Server listenen soll. 'IPAddress.Any' bedeutet nichts anderes, dass er, egal welche ip, jede Verbidnung annimmt, welche auf dem Port 4000 eintrifft.
Wichitg: In diesem Thread wird der ganze Server laufen. Wenn man den Server ohne Thread macht, dann bleibt die ganze Form bei diesem Code hängen 'Server.AcceptTCPClient'. Also nicht Vergessen, wenn man nicht will, dass seine Form sich Aufhängt^^.
OK. Jetzt werden wir in dem Sub Event 'Form1_load' den Thread 'mainthread' eine Adresse geben und dann starten:
So der Thread startet und führt den Sub 'mainserver' aus. Jetzt erst mal der ganze sub und danach die Erklärung:
VB.NET-Quellcode
- Sub mainserver()
- Try
- Server = New TcpListener(ipendpoint)
- Server.Start()
- client = Server.AcceptTcpClient
- stream = client.GetStream
- streamr = New StreamReader(stream)
- streamw = New StreamWriter(stream) ' Müsste eigentlich alles Klar sein.
- While True
- Select Case streamr.ReadLine
- Case "irgendwas"
- streamw.WriteLine("zu irgendwas eine anwort")
- streamw.Flush()
- Case "...." ' ......
- Case "logoff" '........
- End Select
- End While
- Catch
- ' Hier wieder eine Fehler behandlung und ein neuen Versuch den Server zu starten...
- End Try
- End Sub
Ojeje: Ihre Nachricht ist zu lang. Es stehen maximal 15 000 Zeichen zur Verfügung.
OK wenn das Forum das so will, folgt der Rest des Tuts unten.^^
Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „Malischh“ ()