Socket Mehrere Clientanmeldungen am Server

goodcat

Aktives Mitglied
Hi,

ich habe eine Frage bezüglich der Socketprogrammierung in Java.

Vielleicht kurz meine Klassen (Ausschnitt):

TCPServer.java
Java:
public void run() {

		try	{
			
			//Erzeugen des Socket
			ServerSocket socket = new ServerSocket (SERVER_PORT);
			
			print("Warten auf Verbindungen ...");
			
			while(true) {

				this.client = socket.accept();

				print( "Clientanmeldung: IP-Adresse: " + client.getInetAddress().getHostAddress() + " Port: " + client.getPort());
				
				//Thread erzeugen, der Kommunikation
				//mit Client übernimmt
				
			}
		}
		catch(BindException e1) {
			print("Address already in use.");
	    }
		catch(Exception e)	{
			e.printStackTrace();
		}
	    
	}

Wenn sich ein Client anmeldet befindet er sich in "Wartestellung" wenn der Server dann ein Ereignis feststellt z.B. ich drücke auf der ServerGui auf einen Button dann wird ein Thread erstellt...

TCPThread.java
Java:
public void run() {
		try	{

			OutputStream output = client.getOutputStream();

			byte[] antwort = ( sqlID.getBytes() );
			output.write (antwort);
			
			// Verbindung beenden
//			client.close();
//			print ( ":\tClient erfolgreich bedient ...");
		}
		catch (Exception e)	{
			// Wenn ein Fehler auftritt ...
			e.printStackTrace();
		}
	}

Und die Daten (in meinem Fall eine SQLID) werden an den Client gesendet
Das funktioniert auch ganz prima! (Mit einem Client)

Hier vielleicht noch meine TCPClient.java KLasse die Daten empfangen soll:
Java:
public void run() {
		
		if ( this.connect == 1 ) {
	
			try	{
				// Erzeugen des Socket und Aufbau der Verbindung
				this.socket = new Socket ( server_hostname, server_port );
				this.socket.setKeepAlive(true);
	
				notifyListenerStaus( new DataEvent( this, "Verbindung mit " + this.socket.getRemoteSocketAddress() + " hergestellt") );
				notifyListenerConnection(1);
				
				InputStream stream = this.socket.getInputStream();
				StringBuilder readCharacter; 	
	
				while(true) {
					
					readCharacter = new StringBuilder(); 
					readCharacter.append((char)stream.read()); 
										
					notifyListener( new DataEvent( this, readCharacter.toString() ) );
				}
				
			}
			catch (UnknownHostException e) {
				// Wenn Rechnername nicht bekannt ist ...
				System.out.println ("Rechnername unbekannt:\n" + e.getMessage());
			}
			catch (java.net.ConnectException e) {
				notifyListenerStaus( new DataEvent( this, "Verbindung zu " + server_hostname + ":" + server_port + " konnte nicht aufgebaut werden!" ) );
				notifyListenerConnection(0);
			}
			catch (Exception e) {
				// Wenn die Kommunikation fehlschlägt
				System.out.println ("Fehler während der Kommunikation:\n" +
				e.getMessage());
				e.printStackTrace();
			}
			finally {
				// Beenden der Kommunikationsverbindung
				closeConnection();
			}
		}
		else {
			notifyListenerStaus( new DataEvent( this, "Verbindung zum Server wird nicht aufgebaut..." ) );
			notifyListenerConnection(0);
		}
	}

Jetzt zu meiner Frage und zwar soll sich nicht nur ein Client anmelden sondern vielleicht noch ein zweiter oder dritter. Das Problem ist das (das ist meine Vermutung) der socket mit der zweiten Anmeldung überschrieben wird und daher nur der Client bedient wird der sich als zweites angemeldet hat. Zur Info ich bin noch ein Java Anfänger :rtfm:

Jemand eine Idde wie dieses Prob. zu lösen ist?? Hatte schon dran gedacht jede neue Clientanmeldung in ein Array bzw. was dynamisches z.B. eine ArrayList zu schreiben. Wie ich mit ArrayListen umgehe weis ich aber ich hab keinen schimmer wie ich das mit einem Socket umsetzten soll.

Vielen Dank,
Goodcat
 
S

SlaterB

Gast
> Wie ich mit ArrayListen umgehe weis ich aber ich hab keinen schimmer wie ich das mit einem Socket umsetzten soll.

das klingt so sinnvoll wie 'was eine Einkaufstüte ist weiß ich, aber habe keinen Schimmer wie ich eine Dose Ravioli kaufe'
was macht eine Liste wenn nicht Element aufzunehmen? was ist bei einem Socket anders? Socket in die Liste und fertig

wobei das vielleicht nicht zu empfehlen ist, besser wohl mehrere Objekte der Klasse TCPClient, und die dann in eine Liste,
irgendwo muss das natürlich organisiert sein, das ist bestimmt eher dein Problem,
wo steht steht die Liste, wer befüllt sie usw.
 

goodcat

Aktives Mitglied
Hi SlaterB danke für deine Antwort.

Bis jetzt exitiert noch keine Liste o.ä. das war nur eine Idee. Aber keine Ahnung ob das wirklich sinnvoll ist bzw. ob es nicht eine etwas besser Lösung gibt.

Zur Info. Es gibt 2 Programme, ein Serverprogramm (TCPServer und TCPThread.java) welches Anmeldungen annehmen soll und in einen Wartezustand versetzten soll bis Daten verfügbar sind. Und ein Clientprogramm (TCPCLient.java) welches die Daten empfangen soll.

wobei das vielleicht nicht zu empfehlen ist, besser wohl mehrere Objekte der Klasse TCPClient, und die dann in eine Liste,
irgendwo muss das natürlich organisiert sein, das ist bestimmt eher dein Problem,

Du meinst dann pro Verbindung ein neues TCPServer Objekt anlegen?
Aber würde es nicht reichen die sockets (also pro Clientverbindung) zu "verpacken" (array etc.. ka).

Zur Organisation. Das ist auch ein Problem bis jetzt hat das mit einem Client super funktioniert. Ich dachte ich kann den vorhanden Code so anpassen das mehrere Anfragen in unterschiedlichen Sockets gespeichert werden und beim senden der Daten einfach alle sockets angesprochen werden. (Wenn am Server was passiert sollen alle Clients mit den gleichen Daten gefüttert werden).

Aber ich bin offen für Vorschläge.

Thx Goodcat
 
S

SlaterB

Gast
> Du meinst dann pro Verbindung ein neues TCPServer Objekt anlegen?
nein, TCPClient wie ich schrieb ;) ,
betrifft ja meinem Verständnis nach hauptsächlich die Client-Seite, dort gibts ja gar keinen Server,
auf Serverseite gibt es sowieso schon die Infrastruktur für mehrere Verbindungen?
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Du meinst dann pro Verbindung ein neues TCPServer Objekt anlegen?
Nein, das meint er mit "besser wohl mehrere Objekte der Klasse TCPClient, und die dann in eine Liste" nicht.
Damit der Server mehrer Clients bzw. eigentlich deren Output und InputStreams "bedienen" kann, muss dieser ja die Referenzen darauf halten. Und Listen bieten sich nun mal an um Objekte gleichen Typs zu verwalten.
 

goodcat

Aktives Mitglied
Jau Michael so war das gedacht.

Beim TCPServer wird folgendes gestartet:

Java:
while(true) {
 
                this.client = socket.accept();
 
                print( "Clientanmeldung: IP-Adresse: " + client.getInetAddress().getHostAddress() + " Port: " + client.getPort());
                
                //Thread erzeugen, der Kommunikation
                //mit Client übernimmt
                
            }

Ich habe das so verstanden das pro Client diese Zeile ausgeführt wird:
Code:
this.client = socket.accept();
und in einem (this.client) socket befindet sich dann 1 Clientverbindung. Nun sollen mehrere Verbindungen zu den Clients behandelt werden. Deshalb die Idee mit der Liste.

Und da war jetzt die Frage wie ich das gestalten kann. Ich muss ja eine Abfrage schreiben die jedesmal wenn ein neuer Client anfragt diese Referenz (this.client) auf den Socket in ein neues Objekt packt.

Thx Goodcat
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Und da war jetzt die Frage wie ich das gestalten kann. Ich muss ja eine Abfrage schreiben die jedesmal wenn ein neuer Client anfragt diese Referenz (this.client) auf den Socket in ein neues Objekt packt.
Nein, einfach nur
Code:
liste.add(this.client)
Da Java kein Call by Reference kennt, geht das ohne Probleme.
 

goodcat

Aktives Mitglied
Oh ok das hab ich mit gedacht. Mit ArrayListen hab ich das eine oder andere mal gearbeitet allerdings nie mit Objekten gefüllt. Nur ich hätte mal die Methode accept() etwas genauer anschauen sollen. Dort wird ja gewartet bis ein Client anfragt... :oops:

Die Klasse TCPServer.java habe ich angepasst.
Die Methode sendData( String sqlID ); wird dann von aussen aufgerufen.
Java:
private ArrayList<Socket> socketList = new ArrayList<Socket>();

public void sendData( String sqlID ) {
		new TCPThread(this.socketList, sqlID).start();
	}
	
	public void run() {

		try	{
			
			ServerSocket socket = new ServerSocket (SERVER_PORT);
			
			print("Warten auf Verbindungen ...");
			
			while(true) {

				this.socketList.add(socket.accept());

				print( "Clientanmeldung: IP-Adresse: " + client.getInetAddress().getHostAddress() + " Port: " + client.getPort());
				
			}
		}
		catch(BindException e1) {
			print("Address already in use.");
	    }
		catch(Exception e)	{
			e.printStackTrace();
		}
		finally {
			try {
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	    
	}


TCPThread.java
Java:
public void run() {
		try	{

			for ( int i = 0; i < socketList.size(); i++ ) {
				this.output = socketList.get(i).getOutputStream();
				
				this.daten = ( sqlID.getBytes() );
				this.output.write(this.daten);
				
			}
			
			// Verbindung beenden
//			client.close();
//			print ( ":\tClient erfolgreich bedient ...");
		}
		catch (Exception e)	{
			// Wenn ein Fehler auftritt ...
			e.printStackTrace();
		}
	}

Die For Schleife geht jeden Eintrag in der ArrayList durch nur wird der erste Client der sich am Server anmeldet bedient. Der zweite wird ignoriert. Nur wieso bekommt der 2. Client keine Daten. Die schleife läuft bei zwei Anmeldungen zwei mal durch, also sind auch 2 Sockets in der Liste.
Eine Idee?

Goodcat
 
S

SlaterB

Gast
der Code sieht so richtig aus, ich denke da ist kein Fehler zu erkennen,
wann wird sendData() aufgerufen, nicht zu früh?
baue Log-Ausgaben in die Schleife ein, wird wirklich an zwei Sockets gesendet?

letztlich ist wohl ein vollständiges Testprogramm nötig, wenn nicht sonst wer genialere Einfälle hat
 

goodcat

Aktives Mitglied
Ach shit ja sieht nicht nur richtig aus ist es auch, bis auf den TCPServer da hatte ich noch eine Statusmeldung, blöderweise gibt es natürlich das Obj this.client nicht mehr... Sorry :toll:

Super nur eine Frage noch bezüglich einer getrennten Verbindung. Ich habe die ArrayList, was ist wenn der erste Client das Programm schließt und vorher die Verbindung nicht getrennt wird.

Ich bekomme eine Exception die auch absolut nachvollziehbar ist. Und zwar gibt es den socket nicht bzw. kann auf den socket nicht geschrieben werden. ich habe es mit einer if Abfrage probiert (isBound, isClosed, isConnected - klappt alles nicht).

Code:
if ( this.socketList.get(i).isClosed() == false ) {
					this.output = this.socketList.get(i).getOutputStream();
					
					System.out.println("Angemeldeter Client socket: " + this.socketList.get(i).getInetAddress() + "\n");
					
					this.daten = ( sqlID.getBytes() );
					this.output.write(this.daten);
				}
				else {
					this.socketList.remove(i);
				}

Code:
java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(Unknown Source)
	at java.net.SocketOutputStream.write(Unknown Source)
	at de.TimeTrackerV3Server.Socket.TCPThread.run(TCPThread.java:41)

Kennst Du eine Methode die aprüft ob der CLient überhaupt noch da ist? Oder würdest Du das mit try/catch machen? Was ist die sauberste Möglichkeit das umzusetzten?

Vielen Dank!
 

goodcat

Aktives Mitglied
Ja stimmt. Habe ich in den anderen Teilen des Programms auch immer gemacht.
Ach das ärgert mich, manchmal sieht man den Wald vor lauter Bäumen nicht mehr. Das nächste mal werde ich euch nicht mit solchen Kleinigkeiten nerven ;) ... Einfach mal die API besser lesen. Bin aber auch nur ein kleines byte :lol:

Vielen Dank Michael.. und SlaterB!!!
 

goodcat

Aktives Mitglied
Ja ist quatsch. Da hätte ich mich anders ausdrücken sollen.
Ich habe ArrayLists immer nur für simple Strings oder int benutzt aber nie für z.B. ein ganzes socket Objekt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
E Mehrere Sockets Netzwerkprogrammierung 2
C Mehrere Spielewelten im Multiplayer Netzwerkprogrammierung 2
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
Z Socket [Chatprogramm] Mehrere Clients an einen Server Netzwerkprogrammierung 10
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
M Jetty Konfiguration mehrere Handler? Netzwerkprogrammierung 2
F UDP Server - mehrere Pakete auf einmal Netzwerkprogrammierung 12
A Mehrere gleich Packete behandeln Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
R mehrere MySQL-Zugriffe Netzwerkprogrammierung 3
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
W Bestimmt IP Adresse verwenden wenn man mehrere hat Netzwerkprogrammierung 5
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
L mehrere Streams über einen Socket? Netzwerkprogrammierung 8
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
E Mehrere / bestimmte Netzwerkkarten ansteuern Netzwerkprogrammierung 10
F Mehrere Attachments mit JavaMail API Netzwerkprogrammierung 2
G Proxy und mehrere Verbindungen Netzwerkprogrammierung 4
G Mehrere SSL Verbindungen Netzwerkprogrammierung 2
A Mit Client auf mehrere Server zugreifen Netzwerkprogrammierung 5
M Mehrere Ports gleichzeitig abhören Netzwerkprogrammierung 5
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
G Server an mehrere Clients Netzwerkprogrammierung 15
L JavaMail: Automatisches Email Versand (mehrere Empfänger) Netzwerkprogrammierung 4
U Einen HandlerThread, der mehrere Verbindungen verwaltet? Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? 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
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? 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
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben