Сервер
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();
}
}
}
}
В итоге при каждой попытке я получаю новый пустой файл. не зависимо от формата. В чем может быть проблема ?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно устанвить salt для ShaPasswordEncoder, но не очень понятен принцип взаимодействия с классом MessageDigestPasswordEncoder
Как реализовать При нажатии на GridView подсветить ее и изьять информацию?
Работаю с библиотекой JavaFX, и вот не понимаю вообще,как мне к GUI подключить БД, или лучше сделать коллекции значений,чтобы они были в роли бд?