# FileChannel+SocketChannel:Datei wird nur teilweise übertrage



## Angel4585 (23. Jan 2008)

Hallo,

Ich öffne bei meinem Clientprogramm eine Datei mit RandomAccessFile und gebe mir den FileChannel zurück.

mit diesem schreibe ich per transferTo() auf den SocketChannel.

Beim Server lese ich das Ganze jetzt aus. 

Ich erzeuge also einen FileChannel, lese über transferFrom vom SocketChannel die Datei in ein Verzeichnis.

Bei klleinen Dateien funzt das wunderbar.
Bei großen hab ich jedoch das Problem, dass mir der FileChannel meldet, dass er die komplette Datei kopiert hat, auf der Festplatte aber effektiv nur ein Teil der Datei angekommen ist.

Bei einer Datei die 20MB hat sind zB gerade 9 MB angekommen.


----------



## lhein (23. Jan 2008)

Ohne Code wirds schwierig hier was zu sagen.

lr


----------



## Angel4585 (25. Jan 2008)

Ich habe das ganze jetzt bissl umgebaut, sodass ich Dateien generell in Paketen verschicke.


Zuerst schicke ich zwei Zahlen:


```
ByteBuffer bb = ByteBuffer.allocate(12);
bb.putLong(SIZE).putInt(TYPE);
```
das funzt. ich gebe hier die Größe des folgenden Objekts an.

```
ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(info);
                ByteBuffer bbinfo = ByteBuffer.allocate(baos.size());
                bbinfo.put(baos.toByteArray());
                bbinfo.flip();
                sc.write(bbinfo);
```
das funzt au, das info-Objekt beinhaltet Daten wie Pfad usw zur Datei die ich schicke.

```
Client:

Long sentParts = 0L;
Long transfered = 0L;
do{
    transfered += fc.transferTo(sentParts * 4096, 4096, sc);
    sentParts++;
}while(transfered < fc.size());
fc.close();
raf.close();
```


```
Server:
Long transfered = 0L;
Long receivedParts= 0L;
do{
      doSleep(10);
      transfered += fc.transferFrom(fc, receivedParts*4096, 4096);
      receivedParts++;
}while(transfered < info.getSize());
fc.close();
```

Das Problem ist jetzt, das irgendwie nichts übertragen wird. Die Datei wird angelegt, aber ist leer. 
Hab ich hier das Prinzip nicht verstanden oder hat sich sonst irgendein Fehler eingeschlichen?


----------



## Angel4585 (28. Jan 2008)

Keiner eine Idee?


----------



## Angel4585 (28. Jan 2008)

Ist es möglich das bei dem FileChannel.transferTo() beim Empfänger-SocketChannel ein read-Event beim selector ausgelöst wird? :shock:


----------

