diff --git a/src/main/java/koz01/java2/lab08/IndexReader.java b/src/main/java/koz01/java2/lab08/IndexReader.java index 8ae3d5279801f840144d6c162792bc8cf9a2866e..8ac37e9704e92b947476f871be686a0cc49ed5b7 100644 --- a/src/main/java/koz01/java2/lab08/IndexReader.java +++ b/src/main/java/koz01/java2/lab08/IndexReader.java @@ -35,6 +35,17 @@ public class IndexReader { } + public byte[] readData(int index) { + try (FileChannel fc = FileChannel.open(getFile())) { + return getData(fc, index); + + } + catch (IOException exc) { + log.error("read", exc); + return null; + } + } + private Path getFile() throws IOException { Path LocalFile = Files.createTempFile(null, null).getParent().resolve( IMAGE_NAME); @@ -56,6 +67,26 @@ public class IndexReader { } private byte[] getData(FileChannel fc, int index) throws IOException { + // 0 .. 3 - number of images + // 4 .. 7 - position of image data file + // 9 .. 11 - number of bytes of image data + + // position_in_index := 4 + index * 8 + ByteBuffer bb = ByteBuffer.allocate(8); + fc.position(4 + index * 8); + while (bb.hasRemaining()) { + fc.read(bb); + } + bb.flip(); + int positionOfData = bb.getInt(); + int legthOfData = bb.getInt(); + + // position_of_data := readInt(position_in_index) + // length_of_data := readInt(position_in_index + 4) + // data := readData(position_of_data, length_of_data) + // return data + // bb.array() + return new byte[0]; } } diff --git a/src/main/java/koz01/java2/lab08/RemoteServer.java b/src/main/java/koz01/java2/lab08/RemoteServer.java new file mode 100644 index 0000000000000000000000000000000000000000..98a461a90346cb3841567af788129f301926ebcc --- /dev/null +++ b/src/main/java/koz01/java2/lab08/RemoteServer.java @@ -0,0 +1,51 @@ +package koz01.java2.lab08; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.Set; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class RemoteServer { + + public static void main(String[] args) throws IOException + { + int port = Integer.parseInt(args[0]); + Selector selector = Selector.open(); + // open server socket channel on given port + ServerSocketChannel sc = ServerSocketChannel.open(); + sc.bind(new InetSocketAddress(port)); + sc.configureBlocking(false); + sc.register(selector, SelectionKey.OP_ACCEPT); + log.info("Server started and waiting connection on port {}", port); + while (true) { + selector.select(); + Set<SelectionKey> selectedKeys = selector.selectedKeys(); + Iterator<SelectionKey> iterator = selectedKeys.iterator(); + while (iterator.hasNext()) { + SelectionKey sk = iterator.next(); + if (sk.channel() == sc) { + SocketChannel channel = sc.accept(); + log.info("client connected {}", channel.getRemoteAddress()); + // register channel to selector + } + else { + SocketChannel channel = (SocketChannel) sk.channel(); + // read index of image (int) + int index = 0; + byte[] data = new IndexReader().readData(index); + // write(send) size of data + // write(send) data + } + + iterator.remove(); + } + } + } +}