Server-Client Problem

Unicate

Erfahrenes Mitglied
Hi alle zusammen!

Ich habe ein Problem mit meinem Server. Das glaube ich zumindest.
Mein Client sendet einen Request an den server. Wenn dieser den versucht zu lesen, hört er nie auf dies zu tun. Aber seht selbst:
Java:
...
			in = _client.getInputStream();
			out = _client.getOutputStream();

			byte[] request = readBytes(in);
			if (null != _responder) {
				out.write(_responder.respond(request));
			}
...
in, out und _client werden danach im finally geschlossen
hier die readBytes funktion:
Java:
	private byte[] readBytes(InputStream in) throws IOException {
		byte[] buffer = new byte[1024];
		byte[] result = new byte[0];
		int read = in.read(buffer);
		while (read > 0) {
			byte[] target = new byte[read + result.length];
			System.arraycopy(result, 0, target, 0, result.length);
			System.arraycopy(buffer, 0, target, result.length, read);
			result = target;
			read = in.read(buffer);
		}
		return result;
	}
irgendwann (nachdem alle sachen geschickt worden sind, in meinen beispielen nur strings)
wartet er in Zeile 10.
Da nix mehr kommt, bleibt er da auch ewig stehen.
Auf der Client Seite kann ich den OutputStream noch nicht zu machen, da ich sonst eine Bad Socket Exception bekommen, wenn ich versuche den Response zu lesen.

Wisst Ihr was ich falsch mache?

Danke schonmal!
 
Hi,

ist kein Wunder, dass er in Zeile 10 wartet. Read ist ja auch eine blockierende Funktion und kehrt nur zurück, wenn er etwas gelesen hat oder der Stream geschlossen wurde. Vielleicht könntest du bevor du die Read Methode aufrufst mit in.available() erstmal testen, ob überhaupt was da ist, was du vom Stream lesen kannst und die read Methode erst dann aufrufen, wenn das der Fall ist. Ansonsten kann dein Client ja auch eine String schicken, der das Ende der Anfrage signalisiert.

Gruß
Der Wolf
 
Ich versuchte dies und es hat nicht funktioniert.

Der Stream wird vorzeitig unterbrochen, da in.available() null zurück gibt.
Einziger Unterschied zu meiner hier geposteten Version ist, das er die while-schleife überspringt und ein leeres array zurück gibt. Danach antwortet er dem client (siehe code)


Ich möchte nicht nur Strings verschicken, deswegen möchte ich keine Strings verschicken sondern lasse mir mit getBytes das ByteArray zurückgeben und verschicke dieses.

[Edit:]
Warscheinlich hatte ich was falsch gemacht. Funktioniert jetzt. Hier meine Lösung:
Java:
	private byte[] readBytes(InputStream in) throws IOException {
		byte[] buffer = new byte[1024];
		byte[] result = new byte[0];
		int read = 0;
		while ((read = in.read(buffer)) > 0) {
			byte[] target = new byte[read + result.length];
			System.arraycopy(result, 0, target, 0, result.length);
			System.arraycopy(buffer, 0, target, result.length, read);
			result = target;
			if(!(in.available() > 0))
				break;
		}
		return result;
	}

Wichtig ist auch, das man erst beim zweiten mal lesen fragt ob denn noch bytes zu lesen sind, da es sonst passieren kann (ja, es ist mir passiert), das der Client die Antwort ließt, wenn der Server noch beim schreiben ist. Dann ist nämlich in.availabe() = 0 und er leißt keine Antwort mehr.
 
Zuletzt bearbeitet:
Hi,
wenn du nicht nur Strings verschicken willst, kannst du dir ja auch vielleicht mal die Serialisierung angucken. Dann kannst du ganze Objekte verschicken und mit dem entsprechenden Reader auch komplett wieder einlesen. Dann bist du nicht so Abhängig von deinem ByteArray.

Gruß
Der Wolf
 
Zurück