Auf Thema antworten

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]



Oben