从套接字读取文件的正确方法是什么?

What is the correct way of reading files in from the socket?

从套接字读取文件的正确方法是什么?因为即使在客户端写入文件已经完成,读取文件的循环也不会结束。如果我还有数据要读取,我什至尝试打印缓冲区位置和长度。

这是我读取文件的代码。

private void readActualData(SocketChannel socketChannel) {
    RandomAccessFile aFile = null;
    System.out.println("Reading actual Data");
    try {
        aFile = new RandomAccessFile(path, "rw");
        ByteBuffer buffer = ByteBuffer.allocate(50000000);
        FileChannel fileChannel = aFile.getChannel();

        int length;

        while ((length = socketChannel.read(buffer)) >= 0 || buffer.position() > 0) {
            buffer.flip();
            fileChannel.write(buffer);
            buffer.compact();
            System.out.println("Length : "+length+" and Buffer position : "+buffer.position());
        }
        fileChannel.close();
        System.out.println("End of file reached..Done Reading");

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

此代码假定对等方在文件已完全发送后关闭套接字。如果不是这种情况,您需要更复杂的东西,首先在文件之前传输文件长度,然后将从套接字读取的数量限制为恰好该长度。我提供了一个阻塞模式套接字的示例 here,但将其适应 NIO 并非易事。