Передача файлов (асинхронная и будущая) - PullRequest
0 голосов
/ 30 апреля 2018

У меня проблема с передачей файлов. Я пытаюсь прочитать файл и перенести этот файл в SocketChannel

Сервер

private final AsynchronousFileChannel fileChannel;
private Future<Integer> writeOperation, readOperation;
private long positionWrite, positionRead;


if (key.isWritable()) {
      Storage storage = (Storage) key.attachment();
      SocketChannel socketChannel = (SocketChannel) key.channel();
      ByteBuffer buffer = ByteBuffer.allocate(1024);

      if (storage.fileChannel.size() >= storage.counter) {
           storage.counter+=1024;
           storage.fileReadAndWrite(buffer, socketChannel);
      } else {
           storage.close();
           socketChannel.close();
      }
}



void fileReadAndWrite(ByteBuffer buffer, SocketChannel socketChannel)
            throws InterruptedException, ExecutionException, IOException {
   try {
        if (readOperation != null)
           positionRead += readOperation.get(5, TimeUnit.SECONDS);

        readOperation = fileChannel.read(buffer, positionRead);
        buffer.flip();
        socketChannel.write(buffer);

   } catch (TimeoutException exc) {
        close();
        System.out.println("Read timeout");
   }
}

Клиент

private static final int PORT = 1234;
private static final String HOST = "localhost";
private static final String FILE_NAME = "3.jpg";


private static InetSocketAddress serverAddress = new InetSocketAddress(HOST, PORT);

public static void main(String[] args) {
    try (SocketChannel socketChannel = SocketChannel.open(serverAddress)) {
        try (FileChannel fileChannel = FileChannel.open(
                Paths.get(FILE_NAME), StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
            fileChannel.transferFrom(socketChannel, 0, Long.MAX_VALUE);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Когда я запускаю этот код, я получаю следующее исключение java.nio.BufferOverflowException, или файл не был полностью передан. Не могли бы вы сказать мне, как можно решить эту проблему? Весь код

...