У меня проблема с передачей файлов. Я пытаюсь прочитать файл и перенести этот файл в 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
, или файл не был полностью передан.
Не могли бы вы сказать мне, как можно решить эту проблему? Весь код