# Objekt über socket senden/empfangen



## mabuhay (10. Okt 2010)

Hallo

Ich habe eine Socketverbindung und kann darüber beliebige Objekte versenden. Ich kann nun einfach eine Datei einlesen und z.B. als byte-array in einem Objekt ablegen und das dann senden.
Ist das eine sehr dumme vorgehensweise oder ok? Ich möchte etwas einfaches haben, nicht etwas super schnelles.

Das Objekt wird dann auf der anderen Seite empfangen und abgespeichert. Wenn ich mir den Specherverbrauch der Java-Anwendung aber anschaue wird der nicht wieder freigegeben. Sende ich also ein Objekt mit einer Datei welche 20MB hat bleiben die 20MB im Speicher bestehen. Das Empfangen sieht in etwa so aus:

```
Object o = null;
				while ((o = in.readObject()) != null) {
					incoming.received(o);
					o = null;
				}
```
Mit incoming.received(o) wird das byte-array im objekt als datei gespeichert.
Ich habe mir gedacht wenn ich das Objekt auf null setze dann sollte wenigstens der Garbage Collector den Speicher wieder freimachen, oder überlege ich da was falsch? Gibt es irgend eine Möglichkeit in Java dem Objekt zu sagen dass es nicht mehr gebraucht wird?

Dann noch ne Frage welche gerade zum Thema passt: will ich nun eine sehr grosse Datei versenden (100MB oder mehr) wird ja einfach der Speicher der java VM gefüllt wenn das Objekt empfangen wird. Gibt es da eine bessere Möglichkeit? Müsst ich das mit einem Byte-Stream machen und dann nach und nach die Bytes auf der Festplatte abspeichern? oder geht das auch mit Object-streams?

mfg


----------



## Volvagia (10. Okt 2010)

Der GC arbeitet aber nicht ständig sondern nur zwischendurch.
Nach einem Schleifendurchlauf ist das Object (warscheinlich, kenne die readObject()-Methode intern nicht) sowieso nicht mehr referenziert und das Object sollte recht schnell entsorgt sein.


----------



## dku (10. Okt 2010)

wenn du grosse Dateien verschicken bzw empfangen willst, ist es sicher sinnvoll diese schrittweise in den Speicher zu laden, zu verschicken und auf der anderen Seite wegzuschreiben. 

Erfordert aber auf Sender und Empfängerseite die entsprechenden Programmteile.


----------



## mabuhay (20. Okt 2010)

Hallo

Danke für die Antworten. Habe aber mit einem einfacheren Beispiel herausgefunden dass meine Server/Client Bibliothek nicht daran schuld ist, sonder die Anwendung wo ich die Datei lade und dann nach dem Empfangen weiterverarbeite.

also, Thema gelöst. Das versenden grosser Dateien ist noch nicht ganz implementiert, aber werds sehr wahrscheinlich mit schrittweise laden/versenden/speichern lösen.

mfg


----------

