Simples, funktionierendes Beispiel einer TCP/IP-Verbindung zwischen zwei Rechnern.

    • VB.NET

    Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Michael_57.

      Simples, funktionierendes Beispiel einer TCP/IP-Verbindung zwischen zwei Rechnern.

      Hallo,

      das hier basiert auf Malischh´s großem TCP- und UDP-Tutorial. Ich poste dies bewusst in einem Extra-Thread. Es gab einige Unklarheiten, und es fehlte ein funktionierendes simples Beispiel für eine Verbindung.

      Achtung: Für faule oder alle, die es nicht verstehen/hinbekommen: Unten sind zwei Beispielprojektmappen zum Download.

      Also habe ich eins gemacht. Sowohl Server als auch Client arbeiten in einem separaten Thread, sodass die Anwendung absolut stabil läuft. Ausnahmsweise bekommt ihr hier mal fast reinen Copy/Paste-Code geliefert, ich empfehle euch aber, euch den Code genau anzusehen, damit ihr ihn auch begreift.

      Bei beiden handelt es sich um Windows-Forms-Anwendungen.

      1. Der Server.

      Benötigte Controls: Ein Button "Button1" mit Beschriftung "Start"

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. Public Class Form1
      5. Dim stream As NetworkStream
      6. Dim streamw As StreamWriter
      7. Dim streamr As StreamReader
      8. Dim server As TcpListener
      9. Dim client As New TcpClient
      10. Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
      11. Dim t As New Threading.Thread(AddressOf Main)
      12. Sub Main()
      13. Try
      14. server = New TcpListener(ipendpoint)
      15. server.Start()
      16. client = server.AcceptTcpClient
      17. stream = client.GetStream
      18. streamr = New StreamReader(stream)
      19. streamw = New StreamWriter(stream)
      20. While True
      21. Select Case streamr.ReadLine
      22. Case "Hallo"
      23. MessageBox.Show("Auch hallo!")
      24. End Select
      25. End While
      26. Catch
      27. MessageBox.Show("Socket-Fehler.")
      28. Button1.Text = "Start"
      29. End Try
      30. End Sub
      31. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      32. If Button1.Text = "Start" Then
      33. t.Start()
      34. Button1.Text = "Stop"
      35. Else
      36. client.Close()
      37. streamr.Close()
      38. streamw.Close()
      39. stream.Close()
      40. Button1.Text = "Start"
      41. End If
      42. End Sub
      43. End Class


      1. Der Client.

      Benötigte Controls:

      - Ein Button "Button1" zum Starten des Servers. Beschriftung "Start"
      - Ein Button "Button2" zum Senden
      - Eine Textbox für die Eingabe der IP
      - Eine Textbox für die Eingabe des Ports, Default-Text ist 8000.

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Public Class Form1
      4. Dim stream As NetworkStream
      5. Dim streamw As StreamWriter
      6. Dim streamr As StreamReader
      7. Dim client As New TcpClient
      8. Dim t As New Threading.Thread(AddressOf Listen)
      9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      10. If Button1.Text = "Start" Then
      11. Try
      12. client.Connect(TextBox1.Text, TextBox2.Text)
      13. If client.Connected Then
      14. Button1.Text = "Stop"
      15. stream = client.GetStream
      16. streamw = New StreamWriter(stream)
      17. streamr = New StreamReader(stream)
      18. t.Start()
      19. Else
      20. MessageBox.Show("Verbindung mit " & TextBox1.Text & " nicht möglich!")
      21. End If
      22. Catch
      23. MessageBox.Show("Verbindung mit " & TextBox1.Text & " nicht möglich!")
      24. End Try
      25. Else
      26. Try
      27. client.Close()
      28. stream.Close()
      29. streamw.Close()
      30. streamr.Close()
      31. Catch
      32. Finally
      33. Button1.Text = "Start"
      34. End Try
      35. End If
      36. End Sub
      37. Sub Listen()
      38. While client.Connected
      39. Dim befehl As String = Receive()
      40. If befehl <> "" Then
      41. MsgBox(befehl)
      42. End If
      43. End While
      44. End Sub
      45. Sub Send(ByVal stext As String)
      46. streamw.WriteLine(stext)
      47. streamw.Flush()
      48. End Sub
      49. Function Receive() As String
      50. Try
      51. Return streamr.ReadLine
      52. Catch
      53. Return ""
      54. End Try
      55. End Function
      56. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      57. Dim befehl As String = InputBox("Befehl:", "Senden", "Hallo")
      58. Send(befehl)
      59. End Sub
      60. End Class


      Testen: Geht sogar lokal. Geht auf wieistmeineip.de, öffnet den Server und drückt auf "Start". Öffnet den Client und kopiert eure IP in Textbox1. Den Port könnt ihr bei 8000 lassen, wenn ihr ihn aber anpassen solltet, achtet darauf, dass die Ports identisch sind! So weit so gut - startet den Client mit einem Klick auf "Start". Drückt anschließend auf "Senden" und lasst den Text der Inputbox bei "Hallo". Nun sollte sich der Server mit der Msgbox "Auch Hallo" melden - es hat geklappt, hurra.

      Hier beide Beispielprojektdateien.

      Beispielprojekte.zip

      Bei Routern muss evt. der Port freigegeben werden. Hoffe ihr versteht alles und könnt damit etwas anfangen, hab´s so easy wie möglich gemacht.

      Lg,

      kevin89

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kevin89“ ()

      Hallo Kevin89,

      kleine Bemerkung am Rande,

      VB.NET-Quellcode

      1. Select Case streamr.ReadLine
      2. Case "Hallo"
      3. MsgBox("Auch hallo!")
      4. End Select
      5. End While
      6. Catch
      7. MessageBox.Show("Socket-Fehler.")

      Leg dich doch bitte auf eine Art der Messagebox fest - gemischt ist es nicht schön und verwirrt die Anfänger.

      Die bessere Messagebox ist wohl die des Frameworks (wobei natürlich die andere auch Funktioniert)

      VB.NET-Quellcode

      1. MessageBox.Show("Socket-Fehler.")


      Was mir ausserdem nicht gefällt sind die Dim Befehle im Desklarationbereich der Klasse

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim stream As NetworkStream
      3. Dim streamw As StreamWriter
      4. Dim streamr As StreamReader
      5. Dim client As New TcpClient
      6. Dim t As New Threading.Thread(AddressOf Listen)

      Das Private Statement stellt den Zugriffsmodus genauer dar.
      (Auch hier gilt, so funktiert es natürlich auch)

      Die großen Profis dieses Forums sollten sich auch gedanken darüber machen, welche erzieherische Wirkung ihr Code auf Neulinge hat.
      * An den Ohren pack *

      Gruss

      mikeb69

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mikeb69“ ()

      Hi,

      vielen Dank für deinen Code! Gibt es ne Möglichkeit, die Firewall zu umgehen? Es nervt schon wenn es immer nachfragt ob man die Verbindung zulassen will.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „till7“ ()

      Ich möchte dieses hier auch nutzen, aber definitiv nur lokal im Intranet. Zum Testen - habe gerade keinen 2ten PC hier - habe ich 2 mal VB offen, einmal der TCP Server und einmal TCP Client. Server ist im Debuggermodus gestartet. Wenn ich nun den Client starte und als IP 127.0.0.1 eingebe kommt "Verbindung nicht möglich" wieso? Es ist doch die lokale IP?

      Edit: Okay ich glaube ich hatte den Server nur nicht gestartet ^^
      Ein Fehler is mir aufgefallen, wenn ich an den Server was sende und danach den Client Beende macht der Server eine Error Exception. Es kommt "Socket Fehler". Zudem geht in dieser Try Catch nicht den ButtonText auf "Start" zurück setzten, da ja Main() in einem anderen Thread läuft.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dodo“ ()

      XProg schrieb:

      nein das ist doch die feste ip des eigenen pcs.Du musst schon die ip vom verbindungscomputer angeben.(so hab ich es jedenfalls in der informatik ag mit Batch gelernt)
      Naja klar ich will mich ja auch - erstmal - mit meinem eigenen PC verbinden, zum Testen, hatte ich ja geschrieben gehabt. Funktioniert nun auch! Hatte den Server nicht gestartet!
      Habe sie jetzt aus, aber muss PC neustarten, der spackt gerade ein bissel
      Bin in 5 Minuten wieder da :P
      _____

      Firewall ist aus, funktioniert trotzdem nicht :*( ;(

      Edit by Agent: Keine Doppelposts! Es gibt eine Bearbeitenfunktion!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

      Werde gleich mal den Router neustarten, mal sehen ob dann funzt, naja trotzdem danke für die Hilfe
      ________

      So geht..
      Habe deine Dateien mal runtergeladen und gesehen das in die Textbox2 der Port muss :whistling:

      Edit by Agent: Keine Doppelposts! Es gibt eine Bearbeitenfunktion!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()