Socket Aufhängen beim Lesen

Bizarrus

Bekanntes Mitglied
Huhu..

Ich hab da irgendwie ein kleines Problemchen...

Ich bin derzeit dabei, eine Server/Clientarchitektur zu erstellen.
Ich habe in der Run-Methode eine while-Schleife erstellt und lese dort die verfügbaren Bytes aus.

Kurios ist, dass wenn ich zwei mal den Clienten öffne und diese verbunden sind, alles aufeinmal anfängt zu laggen. Der ganze Rechner wird lahm...

Java:
public void run() {
    	while(true) {
    		int length;
			try {
				length = stream_input.available();
				if(length != 0 && length != -1) {
					byte[] bytes = new byte[(int) length];
					stream_input.read(bytes, 0, bytes.length);
					if(bytes.length != 0 && bytes.length != -1) {
						System.out.println("Read Bytes: " + bytes.length);
						System.out.println(new String(bytes));
						Server.send(new String(bytes));
					}
				}
			} catch (IOException e) {
				System.err.println("[ERROR] (run) :: " + e);
			}
    	}
    }

Ich denke mal dass es nur hierran liegen kann... Kann des sein, dass read irgendwie blockt und ich dies in einem Thread auslagern muss?
 
Da du vorher auf avialbe prüfst wird es nicht blocken denke ich,
ABER da es while(true) ist wird es einen gesamten cpu core verschwenden um ständig zu testen ob was da ist.
Wenn du nun zweimal startest ist dein Dualcore(richtig geraten du haste einen oder?) vollkommen totgelegt.

Kannst aj testweise mla ein Thread.sleep(10) einbauen, wenn dann das extrem laggen wech ist , ist dies die ursache

-> Eigenen Thread zum lesen benutzen, der dann blockiert, solange nichts zum lesen vorhanden ist, (also direkt read ohne aviable übeprüfung)
 
Quadcore hab ich.

Wie kann ich read denn ohne eine angabe nutzen? Man muss doch wissen, wieviel gelesen werden soll...
Ich kanns ja nicht einfach begrenzen, da einige Daten sehr groß sein können. Wir sprechen also nicht von beispielsweise max. 1024 bytes, sondern es kommt auch mal vor, dass es dann vielleicht mal 1024 * keine ahnung was ist...

Wie kann ich das Problem denn am besten bewerkstelligen?
 
hmm ...
da hat der phönix aber in seinem aschehaufen nicht ganz recht


read() ist eine BLOCKIERENDE methode ... sie blockt so lange bis wieder was zu lesen da ist ...
heißt also : selbst wenn das ganze in while(true) steht ist es keine 100% auslastung eines cores da die meiste zeit auf I/O aktivität gewartet wird ...

@TO

ich glaube viel interessanter ist mal der server ... da diser scheinbar mit 2 verbindungen gleichzeitig nicht mehr klarkommt ...

wenn auch das alles nichts hilft solltest du dir noch mal von ganz unten schritt für schritt überlegen wie das ganze ablaufen soll ... und auch dafür sorgen das zwischen einzelnen read-vorgängen genug zeit für andere prozesse bleit und du nicht die gesamte CPU voll auslastest ...


es gibt genug tutorials zu dem thema
 
Das was ich geschreiben habe war unter der Annahme, das über Netzwerk gelesen wird. In dem fall wäre durch das aviable nie blockierend geworden, da er ja nciht zum read kommt dann.

Interessant wäre am rande noch ob Server.send blockiert

Du kansnt bei read zb angeben, dass du einfach 64 bytes lesen willst. Read blockiert dann entweder bis 64 bytes da sind, oder return vorher, es liefert dir zurück wie viele bytes gelesen wurden.

Javadoc:
Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.

If b is null, a NullPointerException is thrown. If the length of b is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the..
Ps. Anonyme beleidiger... sackgesicht (und ja ich stehe dazu, ich traue mich das ach wenn ich angemeldet bin).
 
Zuletzt bearbeitet:

Zurück
Oben