Server mit mehreren Clients

Loud Silence

Bekanntes Mitglied
Ich habe einen Server und einen Client.
Der Server schickt eine Zahl ab und der Client printet sie aus.
Also so einfach wie nur irgend möglich.
Wenn ich jetzt aber einen 2. Client starte kommt die Zahl dort nicht mehr an.
Wie kann ich das ändern?
 
G

Gast2

Gast
- Server wartet auf Verbindungsanfragen
- Client meldet sich beim Server an
- Server startet einen Thread (ClientHandler) der sich um den Client kümmert
- Den Clienthandler merkt sich der Server in einer Liste
- Server wartet wieder auf Verbindungsanfragen

Wenn der Server jetzt was senden will dann geht er seine Liste durch und schickt die daten an jedem einzelnen Client.
 
G

Gawain

Gast
Wie oben erwähnt, ist es notwendig, für jeden Client einen eigenen Thread zu eröffnen. Dadurch kann der Sever auf weitere Anfragen warten und gleichzeitig die bereits vorhandenen Clients versorgen. Du musst nur beachten, dass du die Annahme der Anfragen in eine Schleife packst, die so lange aktiv ist, so lange der Server bereit für Anfragen ist. Wenn du das nicht machst, würde zwar der erste Client einen Thread bekommen, danach würde der Server aber nicht mehr in den Zustand des Abhörens zurück gelangen.

lg
 

Loud Silence

Bekanntes Mitglied
Der User auf der anderen Seite startet den Client.
Wie würde so ein Thread zum Anfragen annehmen ungefähr aussehen?
 
Zuletzt bearbeitet:

Shulyn

Bekanntes Mitglied
Einige wenige Infos wären sehr hilfreich um dir konkret helfen zu können.

- Was für einen Server benutzt du?
- Was für einen Client?
- Welche Frameworks usw...

Sonst können wir dir nur allgemeine Ratschläge geben...
 
G

Gawain

Gast
Ich nehme mal an dass er sich einen eigenen Server und Client programmiert hat.

@Loud Silence: Am besten ließt du in der entsprechenden Literatur/auf Internetseiten nach, wie man in Java mit Threads arbeitet.
Hier bspw: Threads in Java
 

Loud Silence

Bekanntes Mitglied
Ich arbeite mit einem selbstgemachten Client/Server.
Die Funktionen sind oben beschrieben.
Des weiteren sind sowohl schreiben als auch lesen bereits in einem eigenen Thread ausgelagert.
Ich weiß nur nicht was ich genau in den Thread zum Anfragen bearbeiten schreiben soll.
 
G

Gawain

Gast
Dann brauchst du eigentlich keinen Thread mehr für das Annehmen der Anfragen, wenn sich das schon im Hauptprogramm befindet. An und für sich müsste es reichen, wenn du die Annahme jetzt in eine endlos-Schleife packst (die natürlich auf Abbruchbedingungen hört), damit das Programm immer wieder zu
server.accept(); und thread.start(); zurückkommt. Vllt postet du mal einen Codeausschnitt hier rein?
 

Loud Silence

Bekanntes Mitglied
Senden starten:

Java:
KleinerServer() throws IOException {
     while(true) {
            Socket client = server.accept();
          
         ServerSendingThread sst = new ServerSendingThread(client);
          sst.start();
          
          
        }   
}


SendeThread run() Methode
Java:
public void run(){
	try{
		
		System.out.println("Neue Verbindung zu Client");
	
out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

Scanner scanner = new Scanner(System.in);



while(!(msg = scanner.nextLine()).equalsIgnoreCase("end")) {
    sendMessage(msg); // Methode nicht mit angegeben; ist selbsterklärend
}


Client lesen starten:

Java:
 Client() throws IOException {
    	
        Socket server = new Socket ("localhost", 1234);
       ClientReadingThread st = new ClientReadingThread(server);
       
        st.start();
        
     
    }


Mehtode run()

Java:
public void run() {
    try {
    	
    	BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String msg;
        while((msg=reader.readLine())!=null) {
System.out.println(msg)
}
}catch (IOException e) {}
}
 
G

Gawain

Gast
Möglicherweise liegt es daran, dass du in jedem senden-Thread einen eigenen Scanner hast. Diese wechseln sich dann mit dem Abhören der Eingabe ab, sodass jede Eingabe immer nur zu je einem Thread gehört und du die Eingabe damit auch nur zu nur einem Client schickst. Da bin ich mir aber nicht ganz sicher, es kann auch sein dass es unerheblich ist, welcher Scanner die Eingabe 'gefordert' hat, und immer alle Scanner die Eingabe entgegen nehmen (habs jetzt nicht getestet). Probier darher mal, nur einen Scanner bereits in der "KleinerServer()" Methode zu erzeugen, und ihn den ServerSendingThread-Objekten zu übergeben und dort damit zu arbeiten.
Falls es das nicht ist, weiß ich auch nicht. Hab sonst keinen potentiellen Fehler gefunden.

lg
 

Loud Silence

Bekanntes Mitglied
Das hat einen nicht so tollen Effekt:
Ich muss alles sooft eingeben wie Clients vorhanden sind.
Wenn drei Clients geöffnet sind muss ich drei mal dasselbe eingeben.
Aber es wird dann auch an alle geschrieben.
Allerdings spuckt die Konsole einen Fehler aus:

Exception in thread "Thread-3" java.lang.IndexOutOfBoundsException: end
at java.util.regex.Matcher.region(Unknown Source)
at java.util.Scanner.findPatternInBuffer(Unknown Source)
at java.util.Scanner.findWithinHorizon(Unknown Source)
at java.util.Scanner.nextLine(Unknown Source)
at ServerSendingThread.run(ServerSendingThread.java:38)
 
G

Gawain

Gast
Dann mach folgendes: Erstelle noch vor der KleinerServer()-Methode ein ArrayList so wie einen neuen Thread, der das ArrayList übergeben bekommt und nichts anderes tut als von einem Scanner einzulesen. Innerhalb der KleinerServer() Methode nimmst du wie gehabt die Clients entgegen und fügst sie in das ArrayList ein. Der vorher erzeugte Thread ließt nun vom Scanner ein und übergibt die Eingabe an alle im ArrayList vorhandenen Clients. Insofern benötigt deine Client-Klasse eine entsprechende send()-Methode, die du im Thread aufrufen musst. Wenn der Server nur dazu dient, den Clients von sich aus Nachrichten zu schicken, dann brauchst du nicht für jeden Client einen Thread, lediglich die entsprechenden Objekte (OutputStreams).
Ich hoffe du verstehst wie ich es meine.

lg
 
G

Gast2

Gast
Das musst du etwas anders anpacken.
Dein Server verwaltet alle Clients in einer Liste. Du sagst deinem Server dann, dass er eine Nachricht an alle Clients senden soll.
Die Benutzereingabe erfolgt dann in ner separaten Klasse.

Java:
public class Server implements Runnable {

	private List<ClientHandler> clients;
	
	@Override
	public void run() {
		while (true) {
			// Verbindungsanfragen annehmen
			// ClientHandler = ...;
			
			//clients.add(clientHandler);
		}
	}
	
	public void sendMessageToAllClients(String text) {
		for (ClientHandler client : clients) {
			client.sendMessage(text);
		}
	}
}
In einer separaten Klasse instantiierst du dann deinen Scanner und rufst die Methode des Servers auf.
 

Loud Silence

Bekanntes Mitglied
Ok.
Jetzt hab ich glaub ich mehr Fragezeichen als vorher.
Wo starte ich meinen ServerSendingThread?
Ist mit Verbindungsanfragen annehmen server.accept() gemeint?
Was bedeutet das: // ClientHandler = ...; //clients.add(clientHandler);?
 

Loud Silence

Bekanntes Mitglied
Ich habe gerade bemerkt, dass ich bereits die Möglichkeit habe mehrere Clients anzusprechen.
Ich muss den Befehl nur immer sooft eingeben wie es geöffnete Clients gibt.
Kann man das verhindern?
 
G

Gawain

Gast
Also nochmal: Du benötigst eine Liste all deiner Clients, am besten ein ArrayList. Jeder hereinkommende Client wird darin gespeichert. Immer dann, wenn du einen Text in die Konsole eingibst, wird die Liste durchgegangen und jeder einzelne Client angeschrieben.
Wie du diese Idee nun umsetzt bleibt dir überlassen.
 

Loud Silence

Bekanntes Mitglied
Das mit dem abspeichern in einer Liste sollte kein Problem darstellen.
Aber wie kann ich das mit dem Liste durchgehen machen?
Man kann ja nicht schreiben BufferedWriter.write("blabla").to(Alle Typen die in der Liste stehen).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
FireHorses Benutzernamen aus PrivateChannel(Interaction) auf Server bringen Java Basics - Anfänger-Themen 0
HolyFUT Best Practice Architektur WebSocket Server Java Basics - Anfänger-Themen 1
S Server Java Basics - Anfänger-Themen 4
S Server Java Basics - Anfänger-Themen 3
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
W Netwerkprogrammierung und Http Server Java Basics - Anfänger-Themen 10
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
U Erste Schritte Server will nicht übergebenes Objekt speichern Java Basics - Anfänger-Themen 5
B IP Adresse von Wildfly Server Java Basics - Anfänger-Themen 1
cezary Server läßt sich nicht starten Java Basics - Anfänger-Themen 2
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
H java.lang.NoClassDefFoundError Run as>> Run on Server Java Basics - Anfänger-Themen 2
F String zu einem Server senden Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
T Eclipse - GlassFish Server!? Java Basics - Anfänger-Themen 1
I Java Server Faces mit Glassfish Webseite veröffentlichen Java Basics - Anfänger-Themen 4
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
Screen Wie Propertydatei im Server beschreiben? Java Basics - Anfänger-Themen 7
K threaded server Java Basics - Anfänger-Themen 18
E Client Server Java Basics - Anfänger-Themen 12
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
L Chat server Java Basics - Anfänger-Themen 4
O Server Client Problem Java Basics - Anfänger-Themen 2
B Java Server Side Java Basics - Anfänger-Themen 14
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
G JObjekte dynamisch vom Server erzeugen lassen Java Basics - Anfänger-Themen 4
A Server logs auslesen Java Basics - Anfänger-Themen 6
Z Threads, Server, GUI Java Basics - Anfänger-Themen 4
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
M Java class auf Server starten Java Basics - Anfänger-Themen 5
U Java-Programm auf einem Server starten Java Basics - Anfänger-Themen 33
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
X Applet - Client/Server Java Basics - Anfänger-Themen 2
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
S .Bat Server von .java Starten Java Basics - Anfänger-Themen 5
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
M daytime-Server Port 13 Java Basics - Anfänger-Themen 2
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
O (von Applet) daten an Server übergeben Java Basics - Anfänger-Themen 4
W mehrere clients auf einem server Java Basics - Anfänger-Themen 2
R Server-Daten sichern/verschlüsseln Java Basics - Anfänger-Themen 10
N Applets: Objekte vom Server laden Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
V pfad.exists() gilt nicht für "//server/a/xyz.jpg"? Java Basics - Anfänger-Themen 12
F SQL Server aus Umlaute werden Fragezeichen Java Basics - Anfänger-Themen 4
S FTP Server Java Basics - Anfänger-Themen 3
P Application Server Java Basics - Anfänger-Themen 3
B Object an Server senden, Server antwortet mit objekt? Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
H Java-Server mit Browser ansprechen Java Basics - Anfänger-Themen 19
M Standard-Klassen auf Server nicht verfügbar Java Basics - Anfänger-Themen 7
Spin Server Location is not an Sun Java System Application Server 8.2 Java Basics - Anfänger-Themen 2
Dit_ Daten vom Server in einer Schleife Java Basics - Anfänger-Themen 4
S In Eclipse relativen Pfad fuer Tomcat Server erstellen..? Java Basics - Anfänger-Themen 3
M Verbindung zu einem Server über Eclipse Java Basics - Anfänger-Themen 6
0 Frage zu Architektur: Server eines kleines Spiels Java Basics - Anfänger-Themen 4
G Sessionüberprüfung funktioniert lokal aber nicht auf dem Server! Java Basics - Anfänger-Themen 12
S Chat-Server Java Basics - Anfänger-Themen 6
S Java Applet - Verbindung zum Eigenen Server Java Basics - Anfänger-Themen 2
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
M Socket Server Java Basics - Anfänger-Themen 9
M Problem: JSP für Zugriff auf Oracle-Server/Datenbank - sinnvoll? Java Basics - Anfänger-Themen 35
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
brainray Einfachen RMI Server bei einem Provider zum Laufen bringen Java Basics - Anfänger-Themen 3
brainray Server abbrechen mit CTRL-C Java Basics - Anfänger-Themen 2
H Server & Applet Java Basics - Anfänger-Themen 11
Tandibur Server führt "try-catch" nicht aus Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben