Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten?

Eldar

Aktives Mitglied
Hi alle,
ich habe hier ein kleines Speicherproblem bei einer Socketverbindung und hoffe hier jemanden mit einer Lösung zu finden.
Hier steht ein Server der jede Menge Daten an verbundene Clients rausschickt und auf Daten einiger Clients wartet. Während einige Clients nur Daten empfangen, sind andere Clients nur am Senden, und einige senden und empfangen.
Hier geht es um einen nur sendenden Client:
Java:
Socket socket = new Socket (IP, PORT);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(), buffer);
out.write(bytearray,0,10);
out.flush();
Das Problem ist, dass die Socketverbindung alle paar Sekunden abbricht (broken Pipe) weil die vom Server(!) gesendeten Daten wohl einen Speicher beim client(!) zum überlaufen bringen.
Jetzt ist die Frage wie ich verhindern kann, dass die am Client ankommenden Daten den Speicher zu überlaufen bringen.
 
Zuletzt bearbeitet:

areafo

Mitglied
Wenn der Speicher nicht ausreicht um den Stream direkt umzuwandeln, muss in eine Datei ausgelagert werden im Dateisystem. Anders machen es OS auch nicht ^^
 
T

tuxedo

Gast
BItte nochmal etwas genauer schreiben:

Hier geht es um einen nur sendenden Client:

Java:
Socket socket = new Socket (IP, PORT);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(), buffer);
out.write(bytearray,0,10);
out.flush();

Das Problem ist, dass die Socketverbindung alle paar Sekunden abbricht (broken Pipe) weil die vom Server(!) gesendeten Daten wohl einen Speicher beim client(!) zum überlaufen bringen.

Wenn es um einen Client geht, der NUR sendet und NIX empfängt: Wieso schickt der Server dem Client überhaupt Daten, so dass ein Puffer/Speicher bei diesem Client überläuft?!

Da gibts 2 Möglichkeiten:

1) Der Server schickt diesen NUR SENDENDEN Client einfach nix
2) Der Client empfängt nebenher alles und verwirft es.

- Alex
 

Eldar

Aktives Mitglied
Der Server sendet einfach über den Port raus was er hat. Da verbinden sich mehrere Clients die diese Daten auch brauchen. Nur dieser eine Client eben nicht.
Möglichkeit 2 wäre gut. Nur was muss ich dafür tun?
 
T

tuxedo

Gast
Einen InutStream aufsetzen (vom Socket halt) und mit einem Thread in einer Schleife mit "read()" lesen. Und das gelesene halt "ignorieren".

- Alex
 

Eldar

Aktives Mitglied
Wurgs. Das ist aber sehr unschön. Geht das nicht über eine Socketeinstellung?
Der Client ist ein Handy. Der Server sendet sehr viele Daten (weshalb der Speicher auch innerhalb von Sekunden überläuft) und ein weiterer Thread macht die Displayausgabe extrem kompliziert.
 
T

tuxedo

Gast
Nicht dass ich wüsste. Eleganter wäre es, den Server so einzustellen, dass er diesen "TX Only" clients gar nicht erst Daten sendet. Das würde auch Bandbreite/Traffik sparen.

Wenn das nicht geht:

Ich wüsste nicht wieso ein zusätzlicher Thread, der nix weiter macht als sowas hier (pseudocode)...
Java:
byte[] data = new byte[128];
while(!stopped) {
inputstream.read(data);
}

...zu einem Speicherproblem führt, oder die Displayausgabe negativ beeinflusst oder verkompliziert...
 

Eldar

Aktives Mitglied
Weil der Thread ständig läuft und das Display nicht mehr schnell genug aktualisiert wird um irgendwas flüssig zu zeigen.
Das Problem hab ich bei den empfangsbereiten Clients gerad noch hinbekommen. Aber man muss die ganze Displaybehandlung umstrukturieren.

Der Server ist "dumm". Er merkt zwar, dass sich ein Client verbunden hat, weiß aber nicht was der will.
 
T

tuxedo

Gast
Sicher dass du für's empfangen wirklich nen extra Thread abgestellt, und nicht den UI Thread verwendet hast?

IO-Operationen sollten keinesfalls im UI Thread erfolgen sondern immer in einem eigenen Thread laufen.

Der Empfangsthread benötigt nur soviel CPU Zeit wie Daten ankommen. Kommen keine Daten mehr an, blockiert der Thread (read() blockiert bis Daten anliegen).
Wenn auch das zu viel CPU Zeit kostet, dann bleibt nur der Weg über den Server ...

- Alex
 

Eldar

Aktives Mitglied
Ja ich bin sicher. Das Problem ist eben, dass da sehr viele Daten ankommen und ich trotzdem mindestens 20 Bilder pro Sekunde gewährleisten muss. Ohne den Umweg über die Surfaceview (Android) ist da nix zu machen.
Bei dem sendenden client kann ich das nicht gebrauchen.

edit: sorry dass die Antwort so lange gedauert hat. Hab nochmal mit einem Kollegen (der für den Server zuständig ist) rücksprache gehalten. Es muss wohl über den Server gemacht werden.
Schade. Aber interessant, dass ich so wohl Applikationen abschiessen kann die eigentlich gar keine Daten empfangen sondern nur senden wollen.

Dann auf jeden Fall mal Danke für die Hilfe. So muss ich wenigstens nichts bei mir ändern :D
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben