diff --git a/src/main/java/koz01/java2/lab08/IndexReader.java b/src/main/java/koz01/java2/lab08/IndexReader.java index 8ae3d5279801f840144d6c162792bc8cf9a2866e..ed73714db133eb2caffabd647a60b08698395729 100644 --- a/src/main/java/koz01/java2/lab08/IndexReader.java +++ b/src/main/java/koz01/java2/lab08/IndexReader.java @@ -35,6 +35,18 @@ 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 +68,25 @@ public class IndexReader { } private byte[] getData(FileChannel fc, int index) throws IOException { - return new byte[0]; + //position := readInt(index*8 + 4) + //length := readInt(index*8 + 8) + + //data := readData(position, length) + //return data; + + //go to specific position ... FileChannel.position(long) + //read data ... FileChannel.read(ByteBuffer) + //ByteBuffer.getInt() + + ByteBuffer bb = ByteBuffer.allocate(8); + fc.position(index*8 + 4); + fc.read(bb); + bb.flip(); + int positon = bb.getInt(); + int legth = bb.getInt(); + bb = ByteBuffer.allocate(legth); + fc.position(positon); + fc.read(bb); + return bb.array(); } } diff --git a/src/main/java/koz01/java2/lab08/RemoteImageServer.java b/src/main/java/koz01/java2/lab08/RemoteImageServer.java new file mode 100644 index 0000000000000000000000000000000000000000..aea9f0daec0a42d516150b408279995b1a6cbf88 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/RemoteImageServer.java @@ -0,0 +1,67 @@ +package koz01.java2.lab08; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; +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 lombok.extern.log4j.Log4j2; + +@Log4j2 +public class RemoteImageServer { + + public static void main(String[] args) throws IOException { + IndexReader indexReader = new IndexReader(); + int port = Integer.parseInt(args[0]); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.bind(new InetSocketAddress(port)); + log.info("Waiting connection on port {}", port); + ssc.configureBlocking(false); + Selector selector = Selector.open(); + ssc.register(selector, SelectionKey.OP_ACCEPT); + while (true) { + selector.select(); + Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); + while (keys.hasNext()) { + SelectionKey sk = keys.next(); + if (sk.channel() == ssc) { + SocketChannel sc = ssc.accept(); + sc.configureBlocking(false); + log.info("Connected: {}", sc.getRemoteAddress()); + sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT); + // register sc in selector for Read Operation + } + else { + // get SocketChannel from selection key + // readInt from socketChannel + // writeInt to socketChannel ... length of image + // writeData to socketChannel + ByteChannel sc = (ByteChannel) sk.channel(); + ByteBuffer bb = ByteBuffer.allocate(4); + if (sc.read(bb) < 0) { + // connection is closed so remove selector + sk.cancel(); + } + bb.flip(); + int index = bb.getInt(); + byte[] data = indexReader.readData(index); + bb.clear(); + bb.putInt(data.length); + bb.flip(); + sc.write(bb); + bb = ByteBuffer.wrap(data); + bb.position(bb.limit()); + bb.flip(); + sc.write(bb); + } + keys.remove(); + } + } + } + +} diff --git a/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml b/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml index 366bd4cf3fbbdb517b5a0f759af0ae2969cb92fb..bf5d111c5b25e051875a844b9c705ed65708c847 100644 --- a/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml +++ b/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml @@ -13,8 +13,8 @@ <Label layoutX="81.0" layoutY="592.0" prefHeight="26.0" prefWidth="103.0" text="Index obrázku" /> <Button fx:id="load" disable="true" layoutX="306.0" layoutY="592.0" mnemonicParsing="false" onAction="#readButton" text="Načti" /> <Label layoutX="81.0" layoutY="531.0" text="Adresa" /> - <TextField fx:id="adress" layoutX="149.0" layoutY="526.0" prefHeight="26.0" prefWidth="131.0" /> - <TextField fx:id="port" layoutX="207.0" layoutY="560.0" prefHeight="26.0" prefWidth="73.0" /> + <TextField fx:id="adress" layoutX="149.0" layoutY="526.0" prefHeight="26.0" prefWidth="131.0" text="127.0.0.1" /> + <TextField fx:id="port" layoutX="207.0" layoutY="560.0" prefHeight="26.0" prefWidth="73.0" text="10000" /> <Label layoutX="81.0" layoutY="565.0" prefHeight="16.0" prefWidth="46.0" text="Port" /> <Button fx:id="connect" layoutX="306.0" layoutY="526.0" mnemonicParsing="false" onAction="#connect" text="Připojit" /> </children>