Чтение и передача файла

219
01 мая 2018, 02:48

Сервер

public class server_test1 {
private static final int PORT = 1234;
private static final String FILE_NAME = "file.txt";
private static class Storage {
    private final AsynchronousFileChannel fileChannel;
    private Future<Integer> writeOperation, readOperation;
    private long position, positionRead;
    long fileSize = 0;
    Storage() throws IOException {
        fileChannel = AsynchronousFileChannel.open(Paths.get(FILE_NAME),
                StandardOpenOption.CREATE,
                StandardOpenOption.WRITE,
                StandardOpenOption.READ);
    }
    void fileReadAndWrite(ByteBuffer buffer, SocketChannel socketChannel)
            throws InterruptedException, ExecutionException, TimeoutException {
        try {
            if (readOperation != null)  //если
                positionRead += readOperation.get(5, TimeUnit.SECONDS);
            readOperation = fileChannel.read(buffer, positionRead);
            buffer.flip();
            socketChannel.write(buffer);
        } catch (IOException e) {
            close();
            System.out.println("Read timeout");
        }
    }
    void write(ByteBuffer buffer) throws InterruptedException, ExecutionException {
        try {
            if (writeOperation != null)
                position += writeOperation.get(5, TimeUnit.SECONDS);
            writeOperation = fileChannel.write(buffer, position);
        } catch (TimeoutException exc) {
            close();
            System.err.println("Write timeout");
        }
    }
    void close() {
        try {
            fileChannel.close();
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}
    public static void main(String args[]) throws Exception {
    Selector selector = Selector.open();
    try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
        serverSocketChannel.bind(new InetSocketAddress(PORT)); прослушивать ServerSocketChannel.
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            selector.select();
            Set<SelectionKey> keys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = keys.iterator();
            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();
                if (key.isAcceptable()) {
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ,
                            new Storage());
                    System.out.println("isAcceptable");
                }
                if (key.isReadable()) {
                    System.out.println("isReadable");
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    Storage storage = (Storage) key.attachment();
                    ByteBuffer buffer = ByteBuffer.allocate(256);
                    int read = socketChannel.read(buffer);
                    if (read != -1) {
                        buffer.flip();
                        storage.write(buffer);
                    } else {
                        storage.close();
                        socketChannel.close();
                    }
                }
                if (key.isWritable()) {
                    Storage storage = (Storage) key.attachment();
                    if (storag.fileSize < storage.fileChannel.size()) {
                        storag.fileSize+=6;
                        SocketChannel socketChannel = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(6);
                        storage.fileReadAndWrite(buffer, socketChannel);
                        } else {
                               storage.close();
                               socketChannel.close();
                    }
                }
            }
            iterator.remove();
        }
    }
  }
}

Клиент

public class client_test1 {
private static final int PORT = 1234;
private static final String HOST = "localhost";
private static final String FILE_NAME = "src/test/test1/file.txt";
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();
    }
  }
}

Проблема в том что по какой-то причине я не могу передать файл.if (key.isWritable()) Ранее, у меня как то получилось передать цельный файл (создал буфер под размер файла) но сейчас и это не получаеться.

Поменял код, в котором в ассинхронном вызове через костыли просто с одного файла считываю информацию и записываю в другой(написал для тестирования работоспособности не используя SocketChannel)

public class server3 {
private static final int PORT = 1234;
private static final String FILE_NAME = "file.txt";
private static final String FILE_NAME2 = "file2.txt";
private static class Storage {
    private final AsynchronousFileChannel fileChannel,fileChannel2;
    private Future<Integer> writeOperation, readOperation;
    private long position;
    private long positionRead;
    int onlyOne = 1;
    Storage() throws IOException {
        fileChannel = AsynchronousFileChannel.open(Paths.get(FILE_NAME),
                // и помещаем в него путь к файлу и опции(операции которые должны выполняться)
                StandardOpenOption.READ);

        fileChannel2 = AsynchronousFileChannel.open(Paths.get(FILE_NAME2),
                StandardOpenOption.CREATE,
                StandardOpenOption.WRITE);
    }
    void fileReadAndWrite(ByteBuffer buffer) {
        try {
            if (readOperation != null)
                positionRead += readOperation.get(5, TimeUnit.SECONDS);
            fileChannel.read(buffer, positionRead);
            buffer.flip();
            readOperation = fileChannel2.write(buffer,positionRead);
        } catch (Exception e) {
            close();
            System.out.println("Read timeout");
        }
    }
    void write(ByteBuffer buffer) throws InterruptedException, ExecutionException {
        try {
            if (writeOperation != null)
                position += writeOperation.get(5, TimeUnit.SECONDS);
            writeOperation = fileChannel.write(buffer, position);
        } catch (TimeoutException exc) {
            close();
            System.err.println("Write timeout");
        }
    }
    void close() {
        try {
            fileChannel.close();
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}
public static void main(String args[]) throws Exception {
    Selector selector = Selector.open();
    try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
        serverSocketChannel.bind(new InetSocketAddress(PORT));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            selector.select();
            Set<SelectionKey> keys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = keys.iterator();
            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();
                if (key.isAcceptable()) {
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ,
                            new Storage());
                    System.out.println("isAcceptable");
                }
                if (key.isReadable()) {
                    System.out.println("isReadable");
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    Storage storage = (Storage) key.attachment();
                    ByteBuffer buffer = ByteBuffer.allocate(256);
                    int read = socketChannel.read(buffer);
                    if (read != -1) {
                        buffer.flip();
                        storage.write(buffer);
                    } else {
                        storage.close();
                        socketChannel.close();
                    }
                }
                if (key.isWritable()) {
                    Storage storage = (Storage) key.attachment();
                    // onlyOne - отвечает за то что бы условие выполнилось только 1 раз(нужно заменить)
                    if (storage.onlyOne == 1) {
                        SocketChannel socketChannel = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(6);
                        storage.fileReadAndWrite(buffer);
                        storage.close();
                        socketChannel.close();
                    }
                }
            }
            iterator.remove();
        }
    }
  }
}

В итоге при каждой попытке я получаю новый пустой файл. не зависимо от формата. В чем может быть проблема ?

READ ALSO
Как установить salt для ShaPasswordEncoder?

Как установить salt для ShaPasswordEncoder?

Нужно устанвить salt для ShaPasswordEncoder, но не очень понятен принцип взаимодействия с классом MessageDigestPasswordEncoder

220
Выделить ячейки в GridView

Выделить ячейки в GridView

Как реализовать При нажатии на GridView подсветить ее и изьять информацию?

165
Подключение GUI к БД

Подключение GUI к БД

Работаю с библиотекой JavaFX, и вот не понимаю вообще,как мне к GUI подключить БД, или лучше сделать коллекции значений,чтобы они были в роли бд?

182
Родительское окно Java

Родительское окно Java

имеется вопросНиже представлен код:

191