Каков правильный способ чтения файлов из сокета?

Каков на самом деле правильный способ чтения файлов из сокета? Потому что цикл чтения файла не заканчивается, хотя на стороне клиента запись файлов завершена. Я даже пытался распечатать позицию и длину буфера, если мне все еще нужно прочитать данные.

Вот мой код для чтения файла.

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();
    }
}

person jnapor    schedule 30.04.2016    source источник


Ответы (1)


Этот код предполагает, что партнер закрывает сокет, когда файл полностью отправлен. Если это не так, вам нужно что-то более сложное, начиная с передачи длины файла перед файлом, а затем ограничивая объем, считанный из сокета, точно этой длиной. Я привел пример для сокетов в режиме блокировки здесь, но его адаптация к NIO нетривиальна.

person user207421    schedule 30.04.2016
comment
Я размышлял над тем, что вам нужно делать в случае нескольких файлов. Вы должны отсчитать начальную длину файла, и когда то, что осталось прочитать, становится меньше buffer.limit()-buffer.position() в конце цикла чтения, вы должны настроить предел буфера так, чтобы он не был. - person user207421; 02.05.2016