Server-Architektur mit Socket & ServerSocket



  • Hi zusammen,

    zwecks Praktikum bin ich in die wunderbare Lage gekommen einen Chat-Client samt
    Server entwerfen zu dürfen. Soweit so gut 🙂

    Die Charaktere dieser Komödie sind folgende

    ServerEngine
    Eine while-Schleife die, sobald 'ihr' ServerSocket eine Verbindung akzeptiert
    hat, eine Instanz von ServerCommThread mit dem Verbindungs-Socket erzeugt und
    startet.

    ServerCommThread
    Ein Thread, welcher die Daten per InputStream aus dem übergebenen Socket liest
    und entsprechend reagiert (z.B. den Benutzer als Eingeloggt markiert oder die
    Botschaft des Benutzers an den ServerOutputThread übergibt)

    ServerOutputThread
    Sendet eine übergebene Nachricht an alle in einer Liste vermerkten Benutzer.

    Weitere Figuren sind

    ConnectionHandle
    Diese Figur dient dazu eine ID und eine IP-Adresse aufzunehmen um spätere
    abgleiche ob z.B. ein Benutzer bereits online ist vornehmen zu können.

    LinkedList<ConnectionHandle> Users
    Eine Liste in welcher verzeichnet ist, wer gerade im Chat online ist. Diese
    Liste ist allen Bestandteilen des Servers verfügbar.

    Ich hoffe irgendwer kann diesem Gedanken-zu-Tastatur-Transfer folgen 😉
    Nun meine Fragen:

    (1) Was meint ihr generell zu solch einer 'Architektur'?
    (2) Gibt es Modelle für Server bei welchen nicht jede Anfrage über die
    Hauptschleife (hier ServerEngine ) des Servers geht? Wie kann man sowas ohne die
    Verwendung von mehreren (zumindest ein Server- und ein normales Socket pro
    Thread) realisieren? (Hab da mal was von der java.nio quergelesen).

    Danke im Voraus,
    Khadgar



  • Khadgar schrieb:

    (1) Was meint ihr generell zu solch einer 'Architektur'?

    Super! 🤡 👍

    Aber leider auch standard... 🙄

    Khadgar schrieb:

    (2) Gibt es Modelle für Server bei welchen nicht jede Anfrage über die
    Hauptschleife (hier ServerEngine ) des Servers geht?

    Wie meinst Du das??
    Geht doch auch nicht. Nach der Verbindung kümmert sich doch der ServerCommThread um die Verbindung mit dem Client...?!?

    Khadgar schrieb:

    Wie kann man sowas ohne die
    Verwendung von mehreren (zumindest ein Server- und ein normales Socket pro
    Thread) realisieren? (Hab da mal was von der java.nio quergelesen).

    1. Öhhh... das ServerSocket brauchst Du nur einmal.
    Dort wo Du listen() machst.

    2. Mit nur einem Thread geht's über select(), was Sockets auf allen OSen zur Verfügung stellen.
    Java hat das aber nicht drinnen.
    Erst in 1.5 (?) mit Deiner genannten java.nio (new I/O)

    Dort kannst Du das machen.



  • Sgt. Nukem schrieb:

    Khadgar schrieb:

    (1) Was meint ihr generell zu solch einer 'Architektur'?

    Super! 🤡 👍

    Aber leider auch standard... 🙄

    Dann kann ich damit ja nicht soo viel verkehrt machen *g*.

    Sgt. Nukem schrieb:

    Khadgar schrieb:

    (2) Gibt es Modelle für Server bei welchen nicht jede Anfrage über die
    Hauptschleife (hier ServerEngine ) des Servers geht?

    Wie meinst Du das??
    Geht doch auch nicht. Nach der Verbindung kümmert sich doch der ServerCommThread um die Verbindung mit dem Client...?!?

    Leider ist dem nicht so. In diesem Modell sendet der Client eine Anfrage an den
    Server, jener leitet diese an einen neuen Thread weiter, der die Anfrage bearbeitet und dann terminiert.

    Wie kann ich es hinkriegen, dass Anfragen eines bekannten Clients direkt an den
    - seinen - Bearbeitungsthread gehen? Meine Idee war hier jedem Thread noch ein
    ServerSocket und einen eigenen Port mitzugeben - aber diese Idee halte ich für
    §$/?(*.

    Wie kann ich das selbe ohne die Verwendung von zig ServerSockets erreichen?

    Danke im Voraus,
    Khadgar



  • Hi

    jeder ServerComandThread bekommt doch ein Socket objekt mitgeteilt. Über das bekommt er die Daten seines Clients mitgeteilt. Der ServerCommandThread darf sich erst dann beenden, wenn der Client sich auslogt oder sich verabschiedet hat. ggf muss der ServerCommandThread den Client mittteilen, das er ihn jetzt rausschmeist, da von ihm nichts mehr zu hören ist.

    du darft aber auf dem klient auch nicht bei jeder eingabe ein neuen neuen Client socket anfordern. sondern mit dem alten weiterarbeiten. ggf ligt da der hund begraben.

    Ein socket ist ungefähr so wie ein Telefonverbindung mit einem Collsenter (Server). Solang du nicht auflegst hört dich immer die gleiche Dame an der Gegenstelle. Wenn du aber nach jedem satz auflegst und neu wählst. krigtst du immer jemand neues zugeteilt was natürlich nicht gerade förderlich für die Komunikation ist.

    und noch viel spass beim chatten. der Prof heist nicht zufällig Kaspar?

    gruss Termite



  • Termite_ schrieb:

    Hi

    jeder ServerComandThread bekommt doch ein Socket objekt mitgeteilt. Über das
    bekommt er die Daten seines Clients mitgeteilt. Der ServerCommandThread darf sich
    erst dann beenden, wenn der Client sich auslogt oder sich verabschiedet hat. ggf
    muss der ServerCommandThread den Client mittteilen, das er ihn jetzt rausschmeist,
    da von ihm nichts mehr zu hören ist.

    Das heisst, dass ich mit dem übergebenen Socket (nach erstem zustandekommen der
    Verbindung) ein Socket habe durch das ich Nachrichten an den damit verbundenen
    Client schicken kann und mit dem ich Nachrichten des verbundenen Clients empfangen
    kann? Ich dachte bisher das ginge mit einem einfachen Socket nur in eine Richtung 💡

    Termite_ schrieb:

    und noch viel spass beim chatten. der Prof heist nicht zufällig Kaspar?

    Öhm. Wenn der am Lehrstuhl IV der RWTH sitzt kann das sein, ich weiss nur das
    das Praktikum von einem Ralf Wienzek betreut wird, hab aber gerade keine Idee
    auf dem Mist welches Profs das gewachsen ist 🙂

    Vielen Dank,
    Khadgar



  • Khadgar schrieb:

    Das heisst, dass ich mit dem übergebenen Socket (nach erstem zustandekommen der
    Verbindung) ein Socket habe durch das ich Nachrichten an den damit verbundenen
    Client schicken kann und mit dem ich Nachrichten des verbundenen Clients empfangen
    kann? Ich dachte bisher das ginge mit einem einfachen Socket nur in eine Richtung 💡

    Quatsch, natürlich nicht.

    Üblicherweise ist der Hauptthread nur dafür verantwortlich, auf einkommende Verbindungen zu warten.
    Kommt eine, wird (ggf. die Verbindung in einer Liste vermerkt (Player oder Chatter),) ein neuer Thread gestartet (ServerComm) und der kümmert sich fortan um jegliche Client-Server-Verbindung.
    Der Hauptthread wartet daraufhin auf neue einkommende Verbindungen (bis das Maximum erreicht ist) und hat nix mehr mit der Client-Server-Connection von oben zu tun.



  • Vielen Dank!!

    Wieder was gelernt 🙂


Anmelden zum Antworten