Server - Client falscher Rückgabewert

Poehli

Mitglied
Hi,
ich bins mal wieder mit einem Problem :P

Also mein Server läuft wunderbar, kann auch mehrere Aufgaben ausführen und Rückgabewerte liefern. 2 Clients verbinden sich mit diesem und auch dort funktioniert es ganz gut. Jetzt habe ich jedoch das Problem, dass wenn ich eine Überprüfung auf Änderungen beim Server durchführe (Listener), dann gibt er mir ab und zu Rückgabewerte von einem anderen Befehl wieder.
Bsp:
SENDE felder --> 0 0 0 0 0 0 1 2 0 (erwarteter Rückgabewert)
SENDE felder --> Blue 2 true (falscher Rückgabewert)

SENDE spieler --> Blue 2 true (erwarteter Rückgabewert)

Ich habe es bis jetzt so gehandhabt, dass ich die NumberFormatException (von den einzelnen Feldern) einfach ignoriert habe, was zwar klappt, aber irgendwie doof ist ;)

mit Thread.sleep(30) hab ich jeden ausgehenden Befehl versehen, damit der Server auch ein wenig Zeit hat zu denken. Bei mehr "ruckelt" das natürlich alles, was ebenfalls funktioniert, aber doof ist. ;)

Mein Fazit: 2 Threads überschneiden sich, senden jeweils einen unterschiedlichen Rückgabewert und so kommt mein Client durcheinander.

Die Frage ist jetzt nur, wie behebt man dieses?
 
nunja, ich hab eine Gui mit Listeneren auf den Client aufgebaut, demnach behandeln halt mehrere Threads den Client ;)

Oder wie soll ich das sonst handhaben?
 
Ah so, beim Client sind mehrere Threads?
Dachte zuerst, beim Server, mehrere Threads für einen Client.
...Behoben gehörts trotzdem.

Einfache Lösung: Ein Socket pro Thread.
Problem: Server hat keine Ahnung, welche Verbindungen zusammen ein Client sind.
Macht das was?
Bzw. gibt es irgendein Authentifizierungsverfahren oder so,
an dem man die Zugehörigkeit wieder feststellen kann?
 
ok ich bin gerade dabei, dies zu versuchen.
Nein eigentlich ist es nicht wichtig welcher Client aufgerufen wird, da die "personalisierung" erst später stattfindet. (jetzt zumindest xD)

Jetzt tritt aber das Problem auf, dass der Server mir Nullpointer schickt, sobald ich die GUI schließe. Aber soweit ich das sehe, sind alle Threads beendet. Es ist ein ClientThread (so hab ich den Thread genannt, der jeweils ein Client ist), der dies rauswirft. Aber wie gesagt, ich habe alle doppelt geprüft und es sind alle beendet... Er versucht den Befehl null zu senden, um genau zu sein.
 
Java:
while (!isInterrupted()){
			vomClient = new BufferedReader(new InputStreamReader(so.getInputStream()));

			zumClient = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
			
			
			try {
					String kommandozeile = vomClient.readLine();
					
					if (kommandozeile==null){
						System.out.println("****** Abbruch durch Null");
						this.interrupt();
						continue;
					}
					
					StringTokenizer stok = new StringTokenizer(kommandozeile, " \r\n");
					String cmd = stok.nextToken();

					
					if (cmd.equals("EXIT")){
						interrupt();
					} else
					// Daten holen 
					 if (cmd.equals("SENDE")){
						System.out.println(kommandozeile + " von User "+so.getInetAddress());
						processFromClient(stok);
					} else if (cmd.equals("EMPFANGE")){
						sendToClient(stok);

						// Daten Senden
					} else {
						throw new Exception("Unknown Command");
					}

					new PrintWriter(zumClient).println("done for now");
				
			} catch (Exception e){
				//interrupt();
				e.printStackTrace();
				System.out.println("Fehler!");
				new PrintWriter(zumClient).println("Fehler");
			}		

			new PrintWriter(zumClient).println("done");
			}

Das Problem liegt wohl bei der readLine() Methode. Sobald der Client sich abmeldet bekommt er logischerweise einen Null Wert zurück, doch wie behebe ich das schöner, als das was ich hier getan habe?
 
Zurück