Multiserver (TCP)

    • VB.NET

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

      Es ist ein reiner TCP-Server was so viel bedeutet als dass du dass Protokoll selber definieren musst. also ich habe damit sogar schon mal Datein von ein Android System auf den Multiserver übertragen.
      Hi Win8Error,
      Also im prinzip kannst du auch nen string senen, den musst du aber erst in ein byte array wandeln.
      Im endeffekt ist es einfacher die datei als stream einzulesen und diesen stream zu übergeben bzw oder halt das byte array
      Lg Radinator
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
      Ein Sting in ein Bitarray umwandeln? Warum nicht in StreamWriter die WriteLine Methode benutzen wie es auch da gemacht wird? Da kannst ein String übergeben und mit Flush abschicken??

      LG, J. Herbrich
      Hallo Comm,
      Ich habe aus Interesse mal ein bisschen mit dem Code (Startpost) rumgespielt. Dabei ist eine Server Version herausgekommen in der man (meiner Meinung nach) einfach einen Command erstellen kann z.B. \kick
      Außerdem habe ich den Bug Multiserver (TCP) den @Nick33 2010 gefunden hat behoben

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Imports System.Net
      4. Module Server
      5. '\\ Deklarierungen
      6. Private server As TcpListener
      7. Private client As New TcpClient
      8. '\\ Hier wird die IP und der PORT des Servers festgelegt.
      9. '\\ Der angegebene Port (in dem fall 8000) muss möglicherweise freigegeben werden!
      10. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
      11. '\\ Ein Array aller aktuellen Verbindungen
      12. Private connected_user As New List(Of Connection)
      13. '\\ Legt fest wie oft eine leere nachricht ankommen darf befor der Server die verbindung zu dem User trennt
      14. Private max_nothing As Integer = 10000
      15. '\\ Legt das zu Verwendene zeichen für Befehle (am anfang eines satzes) fest!
      16. Private command_identify As String = "\"
      17. Private Structure Connection
      18. '\\ Die benötigten Stream's
      19. Dim stream As NetworkStream
      20. Dim stream_w As StreamWriter
      21. Dim stream_r As StreamReader
      22. '\\ Optionale Identifizirung der User
      23. Dim user_nick As String
      24. Dim user_ip As String
      25. End Structure
      26. Sub Main()
      27. server = New TcpListener(ipendpoint)
      28. server.Start() : Console.WriteLine(String.Format("server started on {0}{1}", ipendpoint.ToString, vbNewLine))
      29. '\\ Es wird auf eine neue Verbinung gewartet
      30. While True
      31. client = server.AcceptTcpClient
      32. '\\ Zu der neuen Verbindung erstellen wir eine Connection
      33. Dim c As New Connection
      34. c.stream = client.GetStream
      35. c.stream_r = New StreamReader(c.stream)
      36. c.stream_w = New StreamWriter(c.stream)
      37. '\\ Nun wird der User Identifiziert (username und ip)
      38. c.user_nick = c.stream_r.ReadLine
      39. Dim ipend As Net.IPEndPoint = client.Client.RemoteEndPoint
      40. If Not ipend Is Nothing Then c.user_ip = ipend.Address.ToString
      41. '\\ Eintragen der information in connected_user
      42. connected_user.Add(c)
      43. '\\ Anzeige welcher User den Chat betreten hat.
      44. Console.WriteLine(String.Format("[+] User: {0} | IP: {1}", c.user_nick, c.user_ip))
      45. '\\ Sollte es gewünscht sein das diese nachricht alle User bekommen das ' in der nächsten Zeile entfernen!
      46. ' SendToAllClients("Server", String.Format("{0} hat den Chat betreten", c.user_nick))
      47. '\\ Startet einen neuen Thread
      48. Dim t As New Threading.Thread(AddressOf ListenToConnection)
      49. t.Start(c)
      50. End While
      51. End Sub
      52. Private Sub ListenToConnection(ByVal con As Connection)
      53. Do
      54. '\\ Auf empfang einer nachricht warten
      55. Dim get_text As String = con.stream_r.ReadLine
      56. Dim get_nothing As Integer
      57. If Not String.IsNullOrEmpty(get_text) Then
      58. '\\ Auswerten ob ein Befehl an den Server gesendet wurde oder nur text
      59. Select Case get_text.ToLower.StartsWith(command_identify)
      60. Case True
      61. commands(con.user_nick, get_text)
      62. Case False
      63. SendToAllClients(con.user_nick, get_text)
      64. End Select
      65. get_nothing = 0
      66. Else
      67. '\\ Bei x leeren nachrichten die verbindung kappen
      68. If get_nothing >= max_nothing Then
      69. connected_user.Remove(con)
      70. Console.WriteLine(String.Format("[-] User: {0} | IP: {1}", con.user_nick, con.user_ip))
      71. Exit Do
      72. End If
      73. get_nothing = get_nothing + 1
      74. End If
      75. Loop
      76. End Sub
      77. Private Sub commands(ByVal user As String, ByVal message As String)
      78. Dim use_command As String = message
      79. Try
      80. use_command = message.Substring(0, message.IndexOf(" "c))
      81. Catch ex As Exception
      82. End Try
      83. '\\ Gibt es den Command? Was macht der Command?
      84. Select Case use_command.Replace(command_identify, "").ToLower
      85. Case Else
      86. ServerMassage(user, String.Format("Befehl < {0} > nicht gefunden", use_command))
      87. End Select
      88. End Sub
      89. '\\ Nachricht an alle User senden
      90. Private Sub SendToAllClients(ByVal user As String, ByVal message As String)
      91. For Each c As Connection In connected_user
      92. Try
      93. c.stream_w.WriteLine(String.Format("{0}: {1}", user, message))
      94. c.stream_w.Flush()
      95. Catch
      96. End Try
      97. Next
      98. Console.WriteLine(String.Format("[A] Sender: {0} | {1}", user, message))
      99. End Sub
      100. '\\ Nachricht an einen User senden
      101. Private Sub ServerMassage(ByVal user As String, ByVal message As String)
      102. For Each c As Connection In connected_user
      103. If c.user_nick = user Then
      104. Try
      105. c.stream_w.WriteLine(String.Format(message))
      106. c.stream_w.Flush()
      107. Catch
      108. End Try
      109. End If
      110. Next
      111. Console.WriteLine(String.Format("[S] Target: {0} | {1}", user, message))
      112. End Sub
      113. End Module


      Bitte bedenkt das es auch andere Möglichkeiten gibt so einen Chat zu erstellen zb: TCPCoreLib

      LG Ruerte
      Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
      has not granted the respective music rights. Sorry about that.

      Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Ruerte“ ()

      Moin,

      ich habe diesen Chat auch mal genommen und programmiere daran schon ne Weile rum.
      Mein Problem ist, da die Nicks, die Online sind, durch die SendToAll Funktion an den Clienten übergeben werden, kann ich im Schreibfenster (eigentlich Lesefenster) nach dem NICK kein : einfügen.
      Soll eigentlich so aussehen:
      Nick: TEXT
      Momentan siehts so aus
      Nick TEXT

      Wenn ich ein Doppelpunkt dazwischen mache
      c.stream_w.WriteLine(String.Format("{0} {1}", user, message))
      Wird dieser auch in der Userliste angezeigt.

      Funktion vom Server

      Quellcode

      1. Private Sub SendToAllClients(ByVal user As String, ByVal message As String)
      2. For Each c As Connection In connected_user
      3. Try
      4. c.stream_w.WriteLine(String.Format("{0} {1}", user, message))
      5. c.stream_w.Flush()
      6. Catch
      7. End Try
      8. Next
      9. Console.WriteLine(String.Format("[A] Sender: {0} | {1}", user, message))
      10. End Sub



      Funktion vom Client:

      Quellcode

      1. Public Sub AddItem(ByVal s As String)
      2. Dim userlist As String()
      3. If s.StartsWith("/u ") Then
      4. userlist = s.Remove(0, 3).Split("|")
      5. ListBox2.Items.Clear()
      6. ListBox2.Items.AddRange(userlist)
      7. Else
      8. If My.Settings.messagebeep = 1 Then
      9. Console.Beep()
      10. End If
      11. If My.Settings.newmessage = 1 Then
      12. lbl_app_new_message.Text = "Neue Nachricht..."
      13. time_newmsg.Start()
      14. End If
      15. RichTextBox1.Text = RichTextBox1.Text & s & vbCrLf
      16. RichTextBox1.SelectionStart = RichTextBox1.Text.Length
      17. RichTextBox1.ScrollToCaret()
      18. End If
      19. End Sub


      Kann mir da jemand weiterhelfen, dass das nicht in der Userliste gezeigt wird, der Doppelpunkt sondern NUR im CHatfenster?

      Ich danke für eure Hilfe.
      Klar, du musst auf der Client Seite oder wo auch immer du es empangen willst mit String.Split(":") denn String in ein Array ufteilen.

      Dann mit array(0) den Usernamen und mit array(1) den Text auslesen und weiter verarbeiten so wie du es halt eben magst. Bitte beachte dass Array die Variable ist in der das Array ist.

      Mach ma so

      VB.NET-Quellcode

      1. Dim s as string = "User:Text"
      2. Dim a() as string = s.split(":")
      3. dim user as string = a(0)
      4. dim message as string = (1)
      5. 'TDO: Hier user und string weitr verarbeiten
      6. 'TDO: Die Variable s mit den Daten aus den Stream Füllen


      Altanativ, erst user und dann text schreiben und danach fluschen und mit read line einfach alles auslesen.

      LG, J.Herbrich
      wen du user:text haben möchtest musst du die strings verbinden mit

      VB.NET-Quellcode

      1. dim output as string = user & ":" & text
      2. console.WriteLine(output)
      Füg den Doppelpunkt doch erst dann, wenn du die Nachricht anzeigst. Also im Client.
      Ansonsten empfehle ich dir ein Protokoll anzufertigen. Dann kannst du ganz einfach zwischen "normalen" Nachrichten und z.B. wie in diesem Fall den Daten für die Userliste unterscheiden.
      Wen ich dir mal einen Ansatz geben ddarf.

      Benutz JSON und Serialisiere beim Senden eine Klasse die du mein empangen Deserialisierst.

      z.B.

      VB.NET-Quellcode

      1. Import System.Runtime.Serialisazion
      2. Import System.Runtime.Serialisazion.Json
      3. <DataContract()> Public Class ChatMessage
      4. <datamember()> Public User as string
      5. <datamember()> Public Message as string
      6. End Class


      LG, J.Herbrich
      Hallo,

      Sorry das sich den Thread nochmal rauskrame... Ich habe Folgendes Problem.

      bei mir wird in den Clients irgendwie nur jeder 2te befehl wargenommen beim server steht aber jeder befehl drinne

      Das heist wenn ich 3 mal den text "test" sende steht im server 3 mal test aber in den clients nur 2 mal 1. und 3.

      Vielen Dank für die Hilfe schon im Vorraus,

      Wenn jemand lust und zeit hat das er mir das eben auch per TS erklären kann und will dann meldet euch eben per PN und ansonsten Danke ich nochmal für alle kommenden Antworten.

      Gruß
      Wenn der computer wirklich alles kann, dann kann er mich mal Kreuzweise!
      @TheFipsi Jetzt wäre es schön, einmal deinen Quellcode zu kennen, aber leider ist meine magische Glaskugel kaputt. Könntest du den einmal posten?

      Grüße
      Väinämö
      Wenn du IN einem privaten Netz (also wo die IPs iwas mit 192.168.X.X sind, dann nimm die private IP her. Wenn du jedoch bei dir daheim bist und einen Freund "anfunken" willst, der bei sich daheim sitzt, musst du die öffentliche IP deines Kumpels kennen/verwenden. Da wist du dann aber Probleme haben, da dann nicht klar ist, WELCHER Rechner gemeint ist. Schau dir dazu einfach mal das IP Protokoll an.

      Funktioniert bei mir irgendwie nicht...
      WAS genau funzt bei dir ned? Zeig uns mal deinen Code.

      Lg Radinator
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell