Multiserver (TCP)

    • VB.NET

    Es gibt 854 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

      es gibt keine richtige Fehlermeldung, aber wenn ich den Nick entferne, merkt der Server, dass der Client sich verbunden hat und nach einiger Zeit nach dem schließen auch, dass die Verbindung sich wieder geschlossen hat.
      Das ist der Quelltext des Servers ohne Nick, beim Client habe ich nichts geändert:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. ' TCP-MultiServer
      5. ' C 2009 - Vincent Casser
      6. Module Module1
      7. Private server As TcpListener
      8. Private client As New TcpClient
      9. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 2209) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
      10. Private list As New List(Of Connection)
      11. Private Structure Connection
      12. Dim stream As NetworkStream
      13. Dim streamw As StreamWriter
      14. Dim streamr As StreamReader
      15. 'Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
      16. End Structure
      17. Private Sub SendToAllClients(ByVal s As String)
      18. For Each c As Connection In list ' an alle clients weitersenden.
      19. Try
      20. c.streamw.WriteLine(s)
      21. c.streamw.Flush()
      22. Catch
      23. End Try
      24. Next
      25. End Sub
      26. Sub Main()
      27. Console.WriteLine("Der Server läuft!")
      28. server = New TcpListener(ipendpoint)
      29. server.Start()
      30. While True ' wir warten auf eine neue verbindung...
      31. client = server.AcceptTcpClient
      32. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
      33. c.stream = client.GetStream
      34. c.streamr = New StreamReader(c.stream)
      35. c.streamw = New StreamWriter(c.stream)
      36. 'c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
      37. list.Add(c) ' und fügen sie der liste der clients hinzu.
      38. Console.WriteLine("joined.")
      39. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
      40. Dim t As New Threading.Thread(AddressOf ListenToConnection)
      41. t.Start(c)
      42. End While
      43. End Sub
      44. Private Sub ListenToConnection(ByVal con As Connection)
      45. Do
      46. Try
      47. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      48. Console.WriteLine(tmp)
      49. SendToAllClients(tmp) ' an alle clients weitersenden.
      50. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
      51. list.Remove(con)
      52. Console.WriteLine("has exit.")
      53. Exit Do
      54. End Try
      55. Loop
      56. End Sub
      57. End Module


      *EDIT*
      Wenn ich den Client starte (Server ist offen), steht im Server sofort "joined". Wenn ich dann versuche eine Nachricht zu schicken, kommt gar nichts und der Client schließt sich nach einer Weile ohne extra Fehlermeldung und im Server steht, dass die Verbindung sich wieder geschlossen hat. ("has exit.")

      ich habe mal die try catches entfernt und nach der Fehlermeldung gesehen: "Von der Übertragungsverbindung können keine Daten gelesen werden: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat."
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub Listen()
      2. While client.Connected
      3. 'Try
      4. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine) 'die gelb markierte Zeile (IO exception wurde nicht behandelt)
      5. 'Catch
      6. ' MessageBox.Show("Verbindung zum Server nicht möglich!")
      7. ' Application.Exit()
      8. 'End Try
      9. End While
      10. End Sub

      funktioniert es denn bei euch wenn ihr einfach diese Codes nehmt? Also einfach nur das senden einer Nachricht und die erscheint dann im server und der Liste des Clients...
      Server:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. ' TCP-MultiServer
      5. ' C 2009 - Vincent Casser
      6. Module Module1
      7. Private server As TcpListener
      8. Private client As New TcpClient
      9. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 2209) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
      10. Private list As New List(Of Connection)
      11. Private Structure Connection
      12. Dim stream As NetworkStream
      13. Dim streamw As StreamWriter
      14. Dim streamr As StreamReader
      15. 'Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
      16. End Structure
      17. Private Sub SendToAllClients(ByVal s As String)
      18. For Each c As Connection In list ' an alle clients weitersenden.
      19. Try
      20. c.streamw.WriteLine(s)
      21. c.streamw.Flush()
      22. Catch
      23. End Try
      24. Next
      25. End Sub
      26. Sub Main()
      27. Console.WriteLine("Der Server läuft!")
      28. server = New TcpListener(ipendpoint)
      29. server.Start()
      30. While True ' wir warten auf eine neue verbindung...
      31. client = server.AcceptTcpClient
      32. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
      33. c.stream = client.GetStream
      34. c.streamr = New StreamReader(c.stream)
      35. c.streamw = New StreamWriter(c.stream)
      36. 'c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
      37. list.Add(c) ' und fügen sie der liste der clients hinzu.
      38. Console.WriteLine("joined.")
      39. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
      40. Dim t As New Threading.Thread(AddressOf ListenToConnection)
      41. t.Start(c)
      42. End While
      43. End Sub
      44. Private Sub ListenToConnection(ByVal con As Connection)
      45. Do
      46. Try
      47. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
      48. Console.WriteLine(tmp)
      49. SendToAllClients(tmp) ' an alle clients weitersenden.
      50. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
      51. list.Remove(con)
      52. Console.WriteLine("has exit.")
      53. Exit Do
      54. End Try
      55. Loop
      56. End Sub
      57. End Module

      Client mit Liste, Textbox und Button:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Public Class Form1
      4. Dim wc As New System.Net.WebClient
      5. Dim ip As String = wc.DownloadString(New System.Uri("http://ip.mcandy007.de/"))
      6. Private stream As NetworkStream
      7. Private streamw As StreamWriter
      8. Private streamr As StreamReader
      9. Private client As New TcpClient
      10. Private t As New Threading.Thread(AddressOf Listen)
      11. Private Delegate Sub DAddItem(ByVal s As String)
      12. Private nick As String = "unknown"
      13. Private Sub AddItem(ByVal s As String)
      14. ListBox1.Items.Add(s)
      15. End Sub
      16. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
      17. 'Try
      18. client.Connect(ip, 2209) ' hier die ip des servers eintragen.
      19. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
      20. 'If client.Connected Then
      21. stream = client.GetStream
      22. streamw = New StreamWriter(stream)
      23. streamr = New StreamReader(stream)
      24. streamw.WriteLine(nick) ' das ist optional.
      25. streamw.Flush()
      26. t.Start()
      27. 'Else
      28. ' MessageBox.Show("Verbindung zum Server nicht möglich!")
      29. ' Application.Exit()
      30. 'End If
      31. 'Catch ex As Exception
      32. ' MessageBox.Show("Verbindung zum Server nicht möglich!")
      33. ' Application.Exit()
      34. 'End Try
      35. End Sub
      36. Private Sub Listen()
      37. While client.Connected
      38. 'Try
      39. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
      40. 'Catch
      41. ' MessageBox.Show("Verbindung zum Server nicht möglich!")
      42. ' Application.Exit()
      43. 'End Try
      44. End While
      45. End Sub
      46. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      47. streamw.WriteLine(TextBox1.Text)
      48. streamw.Flush()
      49. TextBox1.Clear()
      50. End Sub
      51. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      52. nick = InputBox("Nickname: ", "Namen festlegen", "unknown")
      53. End Sub
      54. End Class

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Telcrome“ ()

      hätte jemand einen gescheiten Code für ein kleines Loginsystem?
      Also das man sich erstmal Authentifizieren muss mit Login und Passwort(MD5)?
      Logindaten befinden sich beispielsweise in der Datenbank: "Chat" im Table "User".
      Würde mich sehr freuen, möchte was kleines testen :)
      Habe da ein kleines Problem, habe soweit alles gemacht, jetzt habe ich nur das Problem, das wenn ich den Chat schließe, dass die Verbindung bestehen bleibt (im Server wird nicht angezeigt, dass ich den Server verlassen habe).
      Wie stell ich ein, dass beim Schließen des Programms auch die Verbindung beendet wird?

      EDIT: ok, hat sich erledigt ^^
      habe dafür einfach streamw.Close() & streamr.Close() verwendet.
      Würde mich freuen wenn mir wer helfen könnte mit einem Loginsystem :) (Post über diesem hier)

      Dazu hab ich gleich das neue Problem.
      Es soll nur in den Chat geschrieben werden, wenn mehr als 2 Zeichen eingegeben wurden, andernfalls soll es nicht abgesendet werden.
      Hat dafür jemand den passenden Code?
      Denn wenn ich den Chat schließe, wird der Chat mit leeren Zeilen "zugespammt", bevor er die Verbindung schließt, weshalb auch immer.

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Annedroid“ ()

      Hab ein Loginsystem (Mit Regrestrierung).

      Hab ich glaub mal im Showroom gepostet


      mfg
      vb-paradise.de/sonstiges/showr…re/66465-tc-thechat-beta/

      Hab ich mal gepostet, ist aber Design's mässig ein fail von mir. Jedoch alles auf den MultiServer basierend.

      mfg
      Hey ho ihrs, hab mir das ganz jetzt mal angeschaut, und wollt auch mal bissel damit rumspielen, habe nun ma den server mit port 800 im büro aufm pc offen (teamviewer lebe hoch^^) und auf meinem pc den client mit der ip vom bürorechner und demselben port, natürlich geht keine verbindung, also MUSS der port offen sein den ich nutze??, oder wie lös ich sowas? weil um in einem netzwerk oder auf meinem rechner mit mir selbst zu schreiben wäre ja quatsch xD oder gibts vllt so ne art hamachi lösung oder irgendwas =P

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

      Du kannst entweder n VPN nutzen oder Port Forwarding machen.
      Nur weiß ich nicht inwiefern ihr in eurem Büro die Router verändern könnt sodass ein bestimmter Port oder whatever an einen bestimmten Rechner weitergeleitet wird.
      Also: VPN oder Port Forwarding, was anderes geht nicht.

      Streamreader anstelle von Readline

      Hallo und schönen abend.

      Vielen lieben Dank für diesen Hilfreichen Beitrag. Ich habe allerdings ein kleines Problem. Ich arbeite grade an einem SMTP Listener (irgendwie gibt es da nicht wirklich viel zu bei Dr. Google...)

      Grundsätzlich funzt der auch schon ganz gut. Allerdings habe ich das Problem, das ich in dem Fall anstelle der "streamr.ReadLine" einen ByteStream nutze.
      Dim stream As System.Net.Sockets.NetworkStream = Client.GetStream()
      Try
      i = con.stream.Read(bytes, 0, bytes.Length)
      System.Text.Encoding.ASCII.GetString(bytes, 0, i)
      Catch ex AsException
      list.remove(con)
      Exit While
      EndTry

      Mein Problem nun ist, das der Abbruch des RemoteClients (Telnet - fenster einfach zumachen) die Try-Catch schleife irgendwie nicht auslöst. Der Clientthread wird also nicht aus der Liste gelöscht und irgendwann läuft die halt über...

      Hat da jemand einen Tip für mich?

      Vielen Dank

      Liebe Grüße und noch einen schönen Abend

      Martin