Du ignorierst, wie viele Daten Dein Buffer tatsächlich zur Verfügung hat, indem Du das Limit auf einen "gewünschten" Wert setzt. Ich würde es mal nach dem folgendem Ansatz probieren.
Senderseite:
[code=Java]
long size = fileChannel.size();
buf.putLong(size);
buf.flip();
do {
fileChannel.write(buf);
while (buf.hasRemaining());
fileChannel.transferTo(0L, size, socketChannel);
[/code]
Empfängerseite:
[code=Java]
boolean expectLength = true;
long size = 0L;
while (socketChannel.read(buf) != -1) {
if (expectLength) {
if (buf.position() > 7) {
buf.flip();
size = buf.getLong();
expectLength = false;
buf.compact();
fileChannel = ...
}
} else {
buf.flip();
while (size > 0 && buf.hasRemaining()) {
size -= fileChannel.transferFrom(buf, 0, Math.min(buf.remaining(), size));
}
buf.compact();
if (size == 0L) {
fileChannel.close();
expectLength = true;
}
}
}[/code]