Multiserver (TCP)

    • VB.NET

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

      Ich muss erstmal sagen klasse Arbeit vom Thread ersteller .
      Ich finde es Super das du sowas zur Verfügung gestellt hast , besonders weil sich warscheinlich viele User (und wie man ja auch sieht) dafür Interessieren.


      Jetzt zum eigentlichen thema .

      Ich habe Den server bei mir als Windows Form´s Anwendung umgeschrieben.
      und ein Paar Funktionen hinzugefügt .

      jetzt ist die Frage welches Control , brauche ich um z.B. ein Privates Gespräch farblich anders dazustellen als ein Normales Gespräch ?
      das ist doch egal wo, wenn er etwas farblich hervorheben will, dann geht das mit dem WebBrowser, oder mit der RichTextBox, einem eigenen oder einem externen Control, anders gehts nicht...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      hmmmm ... Da muss ich gleich mal schauen , dann kommt mir aber noch eine Frage in den Sinn ... Wie kann ich beim Verbinden des Clients überprüfen , ob der nick schon vorhanden ist und den Client falls der nick schon vorhanden ist Disconnecten lassen mit der Meldung das Der nickname schon vorhanden ist ?!


      Danke Mfg Marlboro@14

      Marlboro@14 schrieb:

      hmmmm ... Da muss ich gleich mal schauen , dann kommt mir aber noch eine Frage in den Sinn ... Wie kann ich beim Verbinden des Clients überprüfen , ob der nick schon vorhanden ist und den Client falls der nick schon vorhanden ist Disconnecten lassen mit der Meldung das Der nickname schon vorhanden ist ?!


      Danke Mfg Marlboro@14

      du machst z.b. eine listbox, wo du alle user auflistest, wenn ein user beitritt, fügt er ihn in der listbox hinzu, und sendet es an alle clients weiter und fügt es da auch in der listbox hinzu, dann überprüfst du ob er existiert.

      lg Gugi
      da das ganze ja am besten Serverseitig geregelt wird, ist eine ListBox wohl unnötig und eine List(Of String/User) wäre wohl besser...
      in diesem Beispiel wird eine List(Of Connection) verwendet, in welcher auch der Nick steht, du musst also einfach die ganze Liste durchlaufen und überprüfen ob in dieser bereits der Nick vorhanden ist, falls ja die Verbindung trennen, falls nein einfach das Programm normal weiterlaufen lassen...(statt das ganze zu durchlaufen, könnte man es noch mit LinQ - unter .Net 3+ machen - oder mit einem IComparer, also erst sortieren und dann suchen, ist performanter ;) )
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      es würde auch gehen ein Thread 100 oder mehr User, das würde auch noch funktionieren man hätte insgesamt weniger Threads und weniger Performance verbrauch ;)...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Aber ReadLine waretet ja auf Messages. Oder nicht?
      D.h wenn jeder strich die readline funktion wäre:
      1-
      2-
      3-
      4-

      1 Würde jetzt ne Message schicken. 2 würde jetzt solang warten bis ne Message kommt. 3,4 und 1 würden dann nie wieder aufgerufen werden, bis 2 eine message bekommt. oder?
      ja, dann muss man das ganze eben anders auslesen, ich verwende dafür sowiso fast nie TCPClient/TCPListener, es sei denn es muss schnell gehen ;) ich verwende immer die ganz normale Socket Klasse...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Ich hätte da eine frage, und zwar, wie bekomme ich das ganze in eine Form also, das es keine Console mehr ist.
      Ich hab keine Probleme mit diesem Code teil:

      VB.NET-Quellcode

      1. Sub Main() ListBox1.Items.Add("Der Server läuft!") server = New TcpListener(ipendpoint) server.Start() While True ' wir warten auf eine neue verbindung... client = server.AcceptTcpClient
      2. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection... c.stream = client.GetStream c.streamr = New StreamReader(c.stream) c.streamw = New StreamWriter(c.stream)
      3. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
      4. list.Add(c) ' und fügen sie der liste der clients hinzu. ListBox1.Items.Add(c.nick & " has joined.") ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten.
      5. Dim t As New Threading.Thread(AddressOf ListenToConnection) t.Start(c) End While End Sub



      Ich habe es schon beim Form load und in ein Timer tick eingefügt, doch beides hat nicht sonderlich geklappt.

      Black schrieb:

      Ich hätte da eine frage, und zwar, wie bekomme ich das ganze in eine Form also, das es keine Console mehr ist.
      Ich hab keine Probleme mit diesem Code teil:

      VB.NET-Quellcode

      1. Sub Main() ListBox1.Items.Add("Der Server läuft!") server = New TcpListener(ipendpoint) server.Start() While True ' wir warten auf eine neue verbindung... client = server.AcceptTcpClient
      2. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection... c.stream = client.GetStream c.streamr = New StreamReader(c.stream) c.streamw = New StreamWriter(c.stream)
      3. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
      4. list.Add(c) ' und fügen sie der liste der clients hinzu. ListBox1.Items.Add(c.nick & " has joined.") ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten.
      5. Dim t As New Threading.Thread(AddressOf ListenToConnection) t.Start(c) End While End Sub



      Ich habe es schon beim Form load und in ein Timer tick eingefügt, doch beides hat nicht sonderlich geklappt.


      wozu denn? die die chatten wollen, brauchen nur den client ;)

      PS: erstell ne konsolenanwendung geh auf projekt->eigenschaften : Anwendungstyp = Windows Forms Anwendung, Startobjekt = Sub Main ;)

      Gruß, Gugi :thumbup: