Überprüfen, ob der Client accepted wurde

Reilif

Mitglied
Ich baue gerade eine Server/ Clientanwendung mit limitierten Multiclient. Sprich ich lasse genau 6 Verbindungen zu. Disconnected ein Client wird sein Platz wieder frei und ein neuer kann sich verbinden.

Soweit funktoniert das auch ganz gut, aber sind 6 Clients verbunden bekomme ich beim 7. Client keine Rückmeldung, dass das connecten mit dem Server nicht geklappt hat. Das ist aber leider notwendig, weil sich anschließend ein Frame öffnet das Informationen über den Server braucht. Das Fenster öffnet sich momentan zwar aber zeigt nichts an(da der Server den Client ja nicht accepted hat).

Vielen Dank für eure Mühe
 
G

Gast2

Gast
Wenn dein Server die Verbindung nicht akzeptiert müsste im Client doch eine Exception fliegen...
der Server akzeptiert ja die Verbindung - ist ja seine Aufgabe ... nach dem verbindungsaufbau muss der Server aber prüfen ob es mehr als 6 Clients sind und dann ggf. die Verbindung wieder trennen ... dazu soltle der Server den Client informieren wieso er wieder trennt

hand, mogel
 

Reilif

Mitglied
Code kommt:

Hier der Server:
Java:
/**
	 * Erstellt einen MultiClient Server mit limitierter Anzahl an Verbindungen.
	 * Accepted neue Clients nur solange Plätze auch wirklich frei sind.
	 * @param port
	 */
	public Server(int port) {
		try {
			server = new ServerSocket(port);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		connectedClients = new ConnectedClient[MAX_PLAYER];
		new Thread(new Runnable() {

			@Override
			public void run() {
				while(true){					
					while (connectionAllowed&&!allSlotsFull()) {
						ConnectedClient connectedClient;
						try {
							int nextid = getNextFreePlace();
							connectedClient = new ConnectedClient(Server.this,
									server.accept(), nextid);
							connectedClients[nextid] = connectedClient;
							System.out.println("New Client connected. IP: "
									+ connectedClient.getIP());
						} catch (IOException e) {
							e.printStackTrace();
						}
						
					}
				}
			}
		}).start();

	}

Hier der Konstruktor der Klasse ConnectedClient, die die Verwaltung der Verbindungen zu einem verbundenen Client aufrecht erhällt:

Java:
public ConnectedClient(Server server, Socket client, int nextId) {
		this.server = server;
		this.client = client;
		this.id = nextId;

		try {
			bufferedReader = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			writer = new PrintWriter(client.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		isConnected = true;
		new Thread(this).start();
	}

Und hier am Ende das Client Gegenstück:

Java:
public Client(final NetzwerkController controller, String inetadress,
			int port, String name) {
		this.controller = controller;

		verbindeServer(inetadress, port);

		try {
			bufferedReader = new BufferedReader(new InputStreamReader(
					server.getInputStream()));
			bufferedWriter = new PrintWriter(server.getOutputStream());
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						String input = bufferedReader.readLine();
						controller.verarbeiteString(input);
					} catch (IOException e) {
						System.out.println("Geht nicht");
					}
				}
			}
		}).start();

	}

	private void verbindeServer(String inetadress, int port) {
		try {
			server = new Socket(inetadress, port);
		} catch (UnknownHostException e1) {
			System.out.println(e1);
		} catch (IOException e1) {
			System.out.println("Geht nicht");
		}

	}

Bei mehr Verbindungen als erlaubt betritt der Server nicht mehr den Teil in dem er Clients accepted. Dadurch wird ein dritter Client (bei 2 erlaubten Verbindungen) nicht mehr accepted. Der Socket auf der Clientseite registriert das anscheinend aber nicht, denn er wirft keine Exception
 
S

SlaterB

Gast
was genau passiert denn auf Client-Seite, wird blockierend gewartet?
setze vielleicht einen Timeout, wenn nach 5 sec nix passiert dann ist der Server eben kaputt
 

Reilif

Mitglied
Die frage ist dann aber, was ist "nix passiert". Ich hab die Methoden der Socket Klasse ausprobiert also: isConnected(); bekomme ich immer true;
getKeepAlive; bekomme ich immer false(auch bei Verbundene Clients)


Um deine Frage zubeantworten:

Sowohl der ConnectedClient auf Server Seite, als auch der Client beim Client horchen in einer endlos Schleife auf Nachrichten des Servers. Jeder String der reinkommt wird "zerlegt" und dann behandelt.
 
S

SlaterB

Gast
auf Serverseite wird doch gar nicht accept() ausgeführt, also gibt es gar keinen ConnectedClient auf Serverseite zu diesen zusätzlichen, nicht eingerichteten Verbindungen?!

du hast dort übrigens eine schlechte Umsetzung, wenn die innere Schleife mit dem accept() nicht arbeitet,
läuft da quasi eine while(true)-Schleife endlos, 100% Belastung für einen Rechenkern,
setze ans Ende der äußeren Schleife ein Thread.sleep(500) und de reduzierst die Abermilliarden Durchläufe pro Sekunde auf 2,
oder Thread.sleep(50), hilft genauso und verringert die Tot-Zeit

> beim Client horchen in einer endlos Schleife auf Nachrichten des Servers
beim Client funktioniert der Verbindungsaufbau?
na auch egal, genauso kann dort die Regel eingebaut werden dass innerhalb einer bestimmten Zeit irgendeine Begrüßungskommunikation stattfinden muss,
wenn nicht gilt das quasi genauso als Timeout, wie auch immer umgesetzt,
ist ein Thread in Endlos-Schleife-Lesen blockiert oder sonstwie beschäftigt ist, ob mit oder ohne Timeout,
könnte ein zweiter Thread dazu das überwachen, wenn der den Socket schließt dürfte der erste Thread auch 'befreit' werden
 
Zuletzt bearbeitet von einem Moderator:

Reilif

Mitglied
Das mit dem Sleep war das eig. drin. Muss bei einer meiner "Suche-den-Fehler" Aktionen wohl unglücklicherweise vernichtet worden sein.

Die Idee mit dem handshake hatte ich auch schon. Dachte bloß das es da vielleicht eine andere Methode gibt.

Danke für deine schnellen Antworten.

ps: Hätte jemand für soetwas schnelle einmal Code zur Hand?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Das mit dem Sleep war das eig. drin.
Das mit dem sleep ist bei einer passenden Implementierung überflüssig.
ps: Hätte jemand für soetwas schnelle einmal Code zur Hand?
Wie der Zufall so will:
http://www.java-forum.org/netzwerkprogrammierung/96318-server-programm-read-beendet.html#post612490
Bei dem Beispiel lässt der Server nur eine Verbindung gleichzeitig zu. Versucht sich ein zweiter Client am Server anzumelden, wird dieser vom Server anständig darüber informiert, dass "besetzt" ist und die Verbindung beendet.
 

Domi F

Mitglied
Ein Handshake sollte nicht notwendig sein. Dein Problem ist, dass das OS TCP-Verbindungen automatisch entgegen nimmt. Es gibt dazu den BACKLOG-Wert, der steuert wieviele Verbindungen vom OS akzeptiert werden, ohne dass dein Code sie auch akzeptiert hat. An diesem Wert herum zu fummeln, bringt die aber kaum etwas, da die verschiedenen OS den von dir gesetzten Wert noch anpassen (typischerweise ist der >= 50). Für weitere Info kannst du nach dem BACKLOG googlen.

Der accept-Aufruf blockiert, bis jemand verbindet. Daher solltest du deine deine while(true)-Schlaufe anders aufbauen. Im Prinzip (in Pseudocode):
Java:
while(true)
{
   socket = serversocket.accept() //blockiert bis jemand verbindet
   if( Maximale Anzahl erreicht)
      socket.close
   else
      dein Verbindungs-Handling
}
So ist kein sleep notwendig und die Verbindung wird beim Client gleich wieder abgebaut, wenn das Limit erreicht ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Überprüfen, ob Person xy auf Twitch streamt Netzwerkprogrammierung 3
Aruetiise Socket Verbindung Überprüfen Netzwerkprogrammierung 18
S Socket Überprüfen, ob ObjectOutputStream beschreibbar ist Netzwerkprogrammierung 3
A Überprüfen, ob Server schon vorhanden ist Netzwerkprogrammierung 4
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
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6

Ähnliche Java Themen


Oben