TCP-Chat: Richtigen Client ansprechen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    TCP-Chat: Richtigen Client ansprechen

    Hallo,

    ich habe ein Problem: Ich möchte gerne einen TCP-Chat programmieren, der übers Internet läuft. Der Chat funktioniert soweit auch. Ich kann Daten vom Client zum Server schicken und umgekehrt. Nur weiß ich im Moment nicht, wie das Verschicken von Daten mit mehreren Clienten geht. Beispielsweise will Client A eine Nachricht an Client B schicken. Die Daten werden also von A zum zentralen Server geschickt und von dort aus zu B weitergeleitet. Dabei habe ich das Problem, dass ich nur einen TCP-Listener verwende, der jeweils nur eine Verbindung annehmen kann. Wie kann ich mehrere TCP-Listener erstellen und dann den richtigen auswählen, damit die Nachricht an den richtigen Client verschickt wird?
    Du brauchst auch nur einen Listener.
    Mit dem Listener nimmst du nur Verbindungen an.
    Zum Senden und Empfangen verwendest du dann den TcpClient oder Sockets.
    Du musst dir halt was überlegen, wie du die Clients untereinander ansprichst.
    zB über einen Namen oder eine Ip.
    Bei einem Chat wäre das zB der eindeutige Username.
    Am Server musst du die Nachrichten auswerten.
    Die könnten zB so Aussehen
    MSG:JannikS:Hey Wie gehts

    Das heisst, der erste String bis : ist der Befehl, der zweite String ist der Name (Darf halt kein : vorkommen oder : muss beim senden und empfangen escaped werden)
    Das ist meine Signatur und sie wird wunderbar sein!
    Am besten Du arbeitest mit Tokens, so wie der Vorposter schon sagte.

    Das Problem das irgendwelche Zeichen nicht funktionieren hast Du übrigens nicht.

    Hier mal ein Beispiel


    WText|EasyMhM|Wie gehts Dir?


    Du Splittest den String bei | und nimmst das erste Splitergebnis(in diesem Fall "WText")

    Da gibst du immer an um was für eine Aktion es sich handelt.

    WText steht z.B für WriteText.

    In dem Jeweiligen Case Abschnitt handelst Du dann..



    VB.NET-Quellcode

    1. Dim S As String = "WText|EasyMhM|Wie gehts Dir?"
    2. 'Ist mal ein Beispiel, S ist natürlich das was man empfängt
    3. Select Case S.Split("|")(0)
    4. Dim D as String() = S.Split("|").Skip(1)
    5. Case "WText"
    6. 'D(0) hast Du dann den Nick
    7. D(1) hast Du dann die Nachricht
    8. End Select
    Das Problem das irgendwelche Zeichen nicht funktionieren hast Du übrigens nicht.


    Doch, nämlich dann, wenn im Nicknamen das Trennzeichen vorkommt.
    Das ist meine Signatur und sie wird wunderbar sein!
    Danke für eure schnellen Antworten. Dass ich im ersten Teil des Strings eine Zeichenfolge verwende, die angibt, ob es sich um eine Nachricht oder sonst was handelt, weiß ich bereits. Mein Problem ist folgendes: Wie kann ich die einzelnen Verbindungen speichern und dann, wenn ich etwas an einen bestimmten Clienten senden will, die richtige Verbindung dazu nehmen? Ich brauche also irgendetwas, das die eingehenden Verbindunen speichert und ich zu einem gewünschten Zeitpunkt auf die richtige Verbindung aus dieser Liste zugreifen kann.
    Wenn Du mehr Eigenschaften über den Client speichern willst, also mehr als die Ip und die Verbindung,
    dann könntest Du eine List(of T) nehmen mit einer vordefinierten Structure.

    Z.B. Sowas:

    VB.NET-Quellcode

    1. Public Structure User
    2. Public Nick, Rang As String
    3. Public Client As TcpClient
    4. End Structure

    VB.NET-Quellcode

    1. Dim AllUsers As New List(Of User)
    2. For each p as User in AllUsers
    3. If p.Nick = "irgendeinbestimmternick" then
    4. 'setzt du Den BinaryWriter und optional den Binaryreader auf den TcpClient
    5. 'Und schreibst eine Nachricht oder machst whatever
    6. End If
    7. Next
    8. usw...



    Ansonsten List(Of TcpClient).
    Naja wenn du einen Chat machen möchtest, kannst Du auch einfach den Tcpclient annehmen,
    und in einer List(Of Tcpclient) speichern.

    Dann hast Du eine Liste mit Tcpclients. Diese Tcpclients haben natürlich auch ein paar Attribute(wie Ip und sowas).
    Das ist sozusagen das mindeste um eine Verbindung mit anderen herzustellen und was senden zu können.

    Aber ich denke Du möchtest auch Username und sowas haben(soll ja ein Chat werden vermute ich mal) und da kannst Du dann direkt mit Structures arbeiten.

    Kevin Hombre schrieb:

    da kannst Du dann direkt mit Structures arbeiten.
    So etwas schreit nach einer Klasse und nicht nach Structures.
    Zieht euch einfach mal die Grundlagen objektorientierter Programmierung rein.
    Ihr werdet es sicher nicht bereuen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --