Multithreading Client / Server erklärt

chrilux

Mitglied
Ich sitze von der Uni aus an einer Aufgabe...

Chatserver / CLient programmierung...


Kann mir jemand struktiert in worten erklären wie ich es realisiere mehrere Clients zu connecten?


Mit der Server horcht mit einer endlosschleife und accept()... soweit so gut...

Wie bekomme ich aber mehrere Clients an den Server ran und besteht dauerhaft eine Verbindung oder wird diese immer wieder neu hergestellt?


Hier geht es erstmal nicht um Coding sondern ums Verständnis...

Habe bisher keine gute Seite im Inet gefunden mit der ich zurecht komme...
Ich muss mir das alles erstmal bildlich vorstellen können...

Das ist derzeit noch mein größtes Problem mit Java:cry:


Hierbei geht es nicht darum was ein Socket oder sowas ist... das ist mir klar...
 

turtle

Top Contributor
Mit der Server horcht mit einer endlosschleife und accept()... soweit so gut...
Wie bekomme ich aber mehrere Clients an den Server ran und besteht dauerhaft eine Verbindung oder wird diese immer wieder neu hergestellt?

Genau, du hast einen ServerSocket auf einem Port erstellt. Dann wartet der ServerSocket darauf, dass sich ein Client verbindet. Diesen Verbindungsaufbau akzeptierst du
Java:
public Socket accept()
und du siehst, dass du einen neuen Socket zurück bekommst. Mit diesem können nun Client/Server beliebig Daten austauschen. Über den Socket kannst du dir über getInputStream bzw. getOutputStream() Streams liefern lassen, um Daten zu lesen oder zu schreiben.

Da nun aber weitere Clients sich ebenfalls verbinden möchten, muss der ServerSocket wieder accept() aufrufen, um auch für diese Clients eine Socket-Verbindung aufzubauen. Daher wird oft der Code nachdem der Socket von accept zurück kommt in einem eigenen Thread ablaufen. Dieser Thread wird dann durch einen entsprechenden Befehl, beendet.

PS: TCP Sockets bleiben offen, bis sie geschlossen werden. Es ist nicht so einfach von einer der beiden Seiten zu erkennen, das die jeweilige andere Seite die Verbindung abgebrochen hat (z.B. wg. Absturz des Rechners).
 
Zuletzt bearbeitet:

chrilux

Mitglied
Hey turtle danke erstmal...



Java:
public class Server implements Runnable {

    private final int port;
    private Server serverObject;
    volatile boolean gestartet;
    volatile boolean unterbrochen;
    ServerSocket serverS;
    Socket clientS;
    public static int teilnehmerCount;

    /**
     * Konstruktor, setzt den gewünschten Port des ChatServers.
     *
     * @param port
     */
    public Server(int port) {
        this.port = port;
    }

    @Override
    public void run() {

        gestartet = oeffneServerSocket();

        if (gestartet) {
            System.out.println("Server ist gestartet....! Höre auf dem Port: " + port);
        }

        // solange unterbrochen nicht true ist...
        System.out.println(unterbrochen);
        while (!unterbrochen) {
            try {

                this.clientS = serverS.accept();

                // erstellen der Streams 
                BufferedReader reader = new BufferedReader(new InputStreamReader(clientS.getInputStream()));
                PrintWriter writer = new PrintWriter(clientS.getOutputStream(), true);
                // Ende der Streams

                String s;
                while ((s = reader.readLine()) != null) {
                    System.out.println("Empfangen vom Client: " + s);
                    writer.write(s);
                    writer.flush();
                }

            } catch (SocketTimeoutException e) {

                System.out.println("Kein Client gehört... versuche es weiter!");

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean oeffneServerSocket() {
        try {
            this.serverS = new ServerSocket(this.port);
            this.serverS.setSoTimeout(2000);
            return true;
        } catch (IOException e) {

            return false;
        }
    }

    public static void main(String[] args) {
        new Thread(new Server(7777)).start();
    }
}


Was sagst du dazu?

Sobald sich ein Client anmeldet, hört der Server auf obwohl er im eigenen Thread läuft...

Ich verstehe wahrscheinlich hier grundlegen was falsch...


(Ich poste jetzt erstmal den Client nicht weil der macht gerade noch nicht viel ;) )
 

turtle

Top Contributor
Bitte sehr, aber...
bitte auch genau lesen, was ich schrieb;)

Die Zeilen
Java:
              // erstellen der Streams 
                BufferedReader reader = new BufferedReader(new InputStreamReader(clientS.getInputStream()));
                PrintWriter writer = new PrintWriter(clientS.getOutputStream(), true);
                // Ende der Streams
 
                String s;
                while ((s = reader.readLine()) != null) {
                    System.out.println("Empfangen vom Client: " + s);
                    writer.write(s);
                    writer.flush();
                }
sollten in einem gesonderten Thread ablaufen, weil sonst der Server EINEN Client bedient und der nächste warten muss.

Sorry, hab leider deinen Post nicht richtig gelesen...:oops:

Ich meinte mit eigenem Thread NICHT den Thread zum Aufbau des ServerSockets, sondern nach dem Accept sollte ein neuer Thread, üblicherweise mit input/output-Streams im Konstruktor starten, damit das Handling komplett vom ServerSocket getrennt ist. Letztere kann dann wieder accept() machen und auf einen weiteren Client warten.
Pseudo-Code
Java:
	Socket clientSocket=serverSocket.accept();        
    AcceptClient obClient=new AcceptClient(clientSocket.getInputStream(), clientSocket.getOutputStream());
}
class AcceptClient extends Thread
 
Zuletzt bearbeitet:

chrilux

Mitglied
Java:
 public void run() {
        synchronized (this) {
            this.runningThread = Thread.currentThread();
        }
        // solange unterbrochen nicht true ist...
        while (!isShutdown) {

            gestartet = oeffneServerSocket();

            if (gestartet) {
                System.out.println("Server ist gestartet....! Höre auf dem Port: " + port);
            }

            try {

                this.clientS = serverS.accept();

                Handler handler = new Handler(clientS);
                Thread thread = new Thread(handler);
                thread.start();

            } catch (SocketTimeoutException e) {

                System.out.println("Kein Client gehört... versuche es weiter!");

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

So gehts schonmal...

im handler steht jetzt nur der code der vorher in der rund des servers stand...

er horcht aber auf jeden fall weiter ;)

Jetz müsste man nur noch wissen, wer die nachricht geschickt hat und ALLE Clients müssen nachrichten empfangen...
 
Zuletzt bearbeitet:

turtle

Top Contributor
Jetz müsste man nur noch wissen, wer die nachricht geschickt hat und ALLE Clients müssen nachrichten empfangen...

Wer die Nachricht geschickt ist ja eindeutig. Es ist der Thread, den du erzeugt hast bei dessen Verbindungsaufbau.

Und der Server hat ja für alle Clients Threads erstellt und deshalb weißt du auch deren OutputStreams und kannst da was hin senden.

Aber aufgemerkt, du musst hier mit konkurrierenden Zugriff auf Variable des Servers rechnen. Es kann ja passieren, das ein Thread eine Nachricht verschicken möchte UND gleichzeitig kommt ein neuer Client hinzu. Das bedeutet, das du dir Gedanken über die Synchronisierung im Server machen musst.
 

chrilux

Mitglied
Kann ich mir ne Liste von den Chatteilnehmern erstellen, dessen Nickname und Streams darin speichern oder ändern sich die Streams bei jedem neuen Accept?
 

turtle

Top Contributor
Gute Idee;)

TCP-Verbindungen bleiben bestehen, solange bis einer die Verbindung beendet. Also bleiben auch die Streams bestehen.

Hier kann es passieren, das ein Client einfach abstürzt und der Server glaubt, das am anderen Ende des Streams noch der Client ist und den Text anzeigt. Aber dem ist nicht immer so und der Server schickt Daten dann ins Nirwana. Daher kann es zu jedem Zeitpunkt zu Problemen mit dem Netzwerk geben und praktisch alle Methoden schmeißen daher eine IOException oder SocketException bei Problemen.
 

chrilux

Mitglied
Okay... dann kann man ja sagen, dass die Liste max. 3 Teilnehmer groß sein darf und dann beim server ne funktion sendToAll synchronized machen der die liste durchgeht in an die inputstreams sendet... ist das schonmal ne idee? werde mir das wohl alles nochmal aufzeichnen müssen
 

chrilux

Mitglied
Habe mir jetzt mal um den Server gedanken gemacht:

Klasse Server:
Wird als Thread gestartet, besitzt die Methode shutDown() zum herunterfahren

Klasse ConnectionHandler:
Ist ein Thread, der Verbindungen entgegegen nimmt....

Klasse UserListe:
Ist eine Liste die die Streams, Username evtl. IP der aktiven Teilnehmer speichert.


Ist alles erstmal sehr primitiv...

Problem ist nur dass ich noch überprüfen muss wann ein User nicht mehr aktiv ist....
 

turtle

Top Contributor
Problem ist nur dass ich noch überprüfen muss wann ein User nicht mehr aktiv ist....

Es gibt zwei Möglichkeiten, das ein User nicht mehr aktiv ist.

Er sendet ein spezielles Kommando zum Server (beispielsweise "Exit"). Damit weiß der Server das diese Verbindung inaktiv ist und aus der Liste entfernt werden kann. (Normales Logout)

Zweite Möglichkeit: Der User schaltet seinen Rechner einfach aus. (Crash-Szenario)

Dies "kann" der Server mitbekommen, indem normalerweise Clients, während der ganzen Verbindungszeit, periodisch ein Lebenszeichen (sogenannter Heartbeat (HB)) senden. Daran erkennt der Server, da der HB ausbleibt, das der Client wohl tot ist und kann diesen dann ebenfalls aus der Liste entfernen.

Vielleicht helfen diese Infos?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
C Socket MultiThreading Netzwerkprogrammierung 7
P Beispiel zu Multithreading Server Netzwerkprogrammierung 2
S HTTP Grundlegende Fragen zu java multithreading & Glassfish Netzwerkprogrammierung 3
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
G Nullpointer Exception - Multithreading Netzwerkprogrammierung 25
K Multithreading Netzwerkprogrammierung 10
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53

Ähnliche Java Themen

Neue Themen


Oben