From 17ffbd83ab5c3597f4cbce3f934209dcd0faf0b0 Mon Sep 17 00:00:00 2001 From: "isaacklugman@gmail.com" <ik1g19@soton.ac.uk> Date: Wed, 21 Apr 2021 20:01:21 +0100 Subject: [PATCH] giving up with nio --- src/ftp/Controller.java | 6 ++-- src/ftp/{dstore1 => }/Dstore.java | 19 +++++------- src/ftp/Server.java | 29 ++++++++++--------- {src/ftp/dstore1/storage => storage}/test.txt | 0 storage/test1.txt | 0 storage/test2.txt | 0 6 files changed, 26 insertions(+), 28 deletions(-) rename src/ftp/{dstore1 => }/Dstore.java (85%) rename {src/ftp/dstore1/storage => storage}/test.txt (100%) create mode 100644 storage/test1.txt create mode 100644 storage/test2.txt diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java index 388b890..695a828 100644 --- a/src/ftp/Controller.java +++ b/src/ftp/Controller.java @@ -27,6 +27,8 @@ public class Controller extends Server { this.timeout = timeout; this.rbPeriod = rbPeriod; + allocateBufferBytes(256); + openSelector(); } @@ -46,13 +48,13 @@ public class Controller extends Server { @Override - protected void handleRequest(String request, SelectionKey key, ByteBuffer buffer) { + protected void handleRequest(String request, SelectionKey key) { String args[] = request.split(" "); switch(args[0]) { case "JOIN": key.attach(new DstoreConnection(new Index(), Integer.parseInt(args[1]))); - sendMessage("LIST",key,buffer); + sendMessage("LIST",key); break; } } diff --git a/src/ftp/dstore1/Dstore.java b/src/ftp/Dstore.java similarity index 85% rename from src/ftp/dstore1/Dstore.java rename to src/ftp/Dstore.java index 5057094..18735c1 100644 --- a/src/ftp/dstore1/Dstore.java +++ b/src/ftp/Dstore.java @@ -1,4 +1,4 @@ -package ftp.dstore1; +package ftp; import ftp.DstoreConnection; import ftp.Index; @@ -38,9 +38,6 @@ public class Dstore extends Server { this.file_folder = file_folder; - ByteBuffer buffer = ByteBuffer.allocate(256); - - // opening connection to controller // open(addr) acts as convenience method for open() and connect() // in blocking mode, so will wait for response before progressing @@ -53,7 +50,9 @@ public class Dstore extends Server { } - sendMessage("JOIN " + port, toController, buffer); + allocateBufferBytes(256); + + sendMessage("JOIN " + port, toController); openSelector(new SocketChannel[] {toController}); } @@ -92,21 +91,17 @@ public class Dstore extends Server { @Override - protected void handleRequest(String request, SelectionKey key, ByteBuffer buffer) { + protected void handleRequest(String request, SelectionKey key) { String args[] = request.split(" "); switch(args[0]) { case "LIST": - File folder = new File("./storage"); + File folder = new File("storage"); String[] files = folder.list(); -// String fileNames = Arrays.stream(list()) -// .map(File::getName) -// .reduce("", (file1, file2) -> file1 + " " + file2); String fileNames = Arrays.stream(files) .reduce("", (file1, file2) -> file1 + " " + file2); - System.out.println(fileNames); - sendMessage(fileNames, key, buffer); + sendMessage(fileNames, key); break; } } diff --git a/src/ftp/Server.java b/src/ftp/Server.java index 1e50b25..2794745 100644 --- a/src/ftp/Server.java +++ b/src/ftp/Server.java @@ -15,15 +15,20 @@ public abstract class Server { protected int timeout; protected Selector selector; + private ByteBuffer buffer; + + + protected void allocateBufferBytes(int bytes) { + buffer = ByteBuffer.allocate(bytes); //buffer to read/write + } /** * @desc abstract method which handles server requests based on implmentation * @param request request to be handled * @param key corresponding key - * @param buffer buffer to be used for r/w */ - protected abstract void handleRequest(String request, SelectionKey key, ByteBuffer buffer); + protected abstract void handleRequest(String request, SelectionKey key); /** @@ -36,7 +41,6 @@ public abstract class Server { serverSocket.bind(new InetSocketAddress(port)); serverSocket.configureBlocking(false); serverSocket.register(selector, SelectionKey.OP_ACCEPT); - ByteBuffer buffer = ByteBuffer.allocate(256); //buffer to read/write System.out.println("Selector Started"); @@ -59,8 +63,8 @@ public abstract class Server { if (key.isReadable()) { System.out.println("Channel has data to be read"); - String request = takeRequest(buffer, key); - handleRequest(request, key, buffer); + String request = takeRequest(key); + handleRequest(request, key); } iter.remove(); @@ -87,7 +91,7 @@ public abstract class Server { channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); } - ByteBuffer buffer = ByteBuffer.allocate(256); //buffer to read/write + buffer = ByteBuffer.allocate(256); //buffer to read/write System.out.println("Selector Started"); @@ -110,8 +114,8 @@ public abstract class Server { if (key.isReadable()) { System.out.println("Channel has data to be read"); - String request = takeRequest(buffer, key); - handleRequest(request, key, buffer); + String request = takeRequest(key); + handleRequest(request, key); } iter.remove(); @@ -136,12 +140,11 @@ public abstract class Server { /** * @desc reads request from buffer - * @param buffer buffer to read request from * @param key key linking to the channel * @return returns the request * @throws IOException */ - protected String takeRequest(ByteBuffer buffer, SelectionKey key) throws IOException { + protected String takeRequest(SelectionKey key) throws IOException { SocketChannel client = (SocketChannel) key.channel(); client.read(buffer); String request = new String(buffer.array()).trim(); @@ -208,10 +211,9 @@ public abstract class Server { * @desc sends a message using a given key, does not wait for a response * @param msg message to be sent * @param key key of corresponding channel to send message through - * @param buffer buffer to r/w messages * @return */ - protected void sendMessage(String msg, SelectionKey key, ByteBuffer buffer) { + protected void sendMessage(String msg, SelectionKey key) { buffer = ByteBuffer.wrap(msg.getBytes()); SocketChannel channel = (SocketChannel) key.channel(); @@ -230,10 +232,9 @@ public abstract class Server { * @desc sends a message using a given channel, does not wait for a response * @param msg message to be sent * @param channel channel to send message through - * @param buffer buffer to r/w messages * @return */ - protected void sendMessage(String msg, SocketChannel channel, ByteBuffer buffer) { + protected void sendMessage(String msg, SocketChannel channel) { buffer = ByteBuffer.wrap(msg.getBytes()); try { diff --git a/src/ftp/dstore1/storage/test.txt b/storage/test.txt similarity index 100% rename from src/ftp/dstore1/storage/test.txt rename to storage/test.txt diff --git a/storage/test1.txt b/storage/test1.txt new file mode 100644 index 0000000..e69de29 diff --git a/storage/test2.txt b/storage/test2.txt new file mode 100644 index 0000000..e69de29 -- GitLab