diff --git a/src/ftp/Client.java b/src/ftp/Client.java index 7da169f19b3119ac71f6c3f1752b1e5d2ec2a26a..b32fb25f42df3677e7483fda83e27d856e8c44e1 100644 --- a/src/ftp/Client.java +++ b/src/ftp/Client.java @@ -22,7 +22,7 @@ public class Client { /** * @desc constructs a client - * @param cport controller port to use + * @param cport controller port to talk to * @param timeout timeout (ms) */ public Client(int cport, int timeout) { @@ -46,7 +46,6 @@ public class Client { buffer.clear(); client.read(buffer); response = new String(buffer.array()).trim(); - System.out.println("response=" + response); buffer.clear(); } catch (IOException e) { e.printStackTrace(); @@ -67,14 +66,14 @@ public class Client { Scanner scanner = new Scanner(System.in); String command = ""; - while (!command.equals("quit")) { + while (!command.equals("QUIT")) { System.out.println("Enter Command:"); command = scanner.nextLine(); String response = instance.sendMessage(command); - System.out.println(response); + System.out.println("Response: " + response); } } diff --git a/src/ftp/ClientConnection.java b/src/ftp/ClientConnection.java new file mode 100644 index 0000000000000000000000000000000000000000..ccf66feb2aa48040ac918f0348f56fff6bd105b9 --- /dev/null +++ b/src/ftp/ClientConnection.java @@ -0,0 +1,4 @@ +package ftp; + +public class ClientConnection extends Connection { +} diff --git a/src/ftp/Connection.java b/src/ftp/Connection.java new file mode 100644 index 0000000000000000000000000000000000000000..a9933b00d478be2b4370bdf30552b8c71d7fd951 --- /dev/null +++ b/src/ftp/Connection.java @@ -0,0 +1,4 @@ +package ftp; + +public abstract class Connection { +} diff --git a/src/ftp/Controller.java b/src/ftp/Controller.java index ca52024765bfebc463ec846245d0a76d54799f48..0e0aeda0c86f385e4f635a84a39f764f46d4d5a4 100644 --- a/src/ftp/Controller.java +++ b/src/ftp/Controller.java @@ -18,8 +18,6 @@ public class Controller { int timeout; int rbPeriod; - private static final String POISON_PILL = "POISON_PILL"; - /** * @desc constructs a controller @@ -40,7 +38,7 @@ public class Controller { serverSocket.bind(new InetSocketAddress(cport)); serverSocket.configureBlocking(false); serverSocket.register(selector, SelectionKey.OP_ACCEPT); - ByteBuffer buffer = ByteBuffer.allocate(256); + ByteBuffer buffer = ByteBuffer.allocate(256); //buffer to read/write while (true) { selector.select(); @@ -55,34 +53,34 @@ public class Controller { } if (key.isReadable()) { - answerWithEcho(buffer, key); + takeRequest(buffer, key); } + iter.remove(); } } } - private static void answerWithEcho(ByteBuffer buffer, SelectionKey key) - throws IOException { - + private static void takeRequest(ByteBuffer buffer, SelectionKey key) throws IOException { SocketChannel client = (SocketChannel) key.channel(); client.read(buffer); - if (new String(buffer.array()).trim().equals(POISON_PILL)) { - client.close(); - System.out.println("Not accepting client messages anymore"); - } - else { - buffer.flip(); - client.write(buffer); - buffer.clear(); + String command = new String(buffer.array()).trim(); + System.out.println("Received: " + command); + + switch(command) { + case "DSTORE": + key.attach(new DstoreConnection(new Index())); + break; } - } + buffer.flip(); //reset pos to 0, sets limit to what was wrote, ready for reading + client.write(buffer); + buffer.clear(); //empties buffer and clears, ready for writing + } - private static void register(Selector selector, ServerSocketChannel serverSocket) - throws IOException { + private static void register(Selector selector, ServerSocketChannel serverSocket) throws IOException { SocketChannel client = serverSocket.accept(); client.configureBlocking(false); client.register(selector, SelectionKey.OP_READ); diff --git a/src/ftp/Dstore.java b/src/ftp/Dstore.java new file mode 100644 index 0000000000000000000000000000000000000000..962c931021797687544cd2bba37da44a7cbb723e --- /dev/null +++ b/src/ftp/Dstore.java @@ -0,0 +1,125 @@ +package ftp; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Dstore { + + int port; + int cport; + int timeout; + String file_folder; + + private static SocketChannel dstore; + private static ByteBuffer buffer; + + + /** + * @desc constructs a client + * @param port port to listen on + * @param cport controller port to talk to + * @param timeout timeout (ms) + * @param file_folder where to store data locally + */ + public Dstore(int port, int cport, int timeout, String file_folder) throws IOException{ + this.port = port; + this.cport = cport; + this.timeout = timeout; + this.file_folder = file_folder; + + + // opening connection to controller + // open(addr) acts as convenience method for open() and connect() + // in blocking mode, so will wait for response before progressing + // + try { + dstore = SocketChannel.open(new InetSocketAddress(cport)); + buffer = ByteBuffer.allocate(256); + } catch (IOException e) { + e.printStackTrace(); + } + + sendMessage("DSTORE"); + + + // creating server socket to receive requests and files + // + ServerSocketChannel serverSocket = ServerSocketChannel.open(); + serverSocket.bind(new InetSocketAddress(port)); + while (true) { + SocketChannel client = serverSocket.accept(); + + new Thread( () -> { + + } ).start(); + + } + } + + + public String sendMessage(String msg) { + buffer = ByteBuffer.wrap(msg.getBytes()); + String response = null; + try { + dstore.write(buffer); + buffer.clear(); + dstore.read(buffer); + response = new String(buffer.array()).trim(); + buffer.clear(); + } catch (IOException e) { + e.printStackTrace(); + } + return response; + + } + + + private static void takeRequest(ByteBuffer buffer, SelectionKey key) + throws IOException { + + SocketChannel client = (SocketChannel) key.channel(); + client.read(buffer); + String command = new String(buffer.array()).trim(); + System.out.println("Received: " + command); + + buffer.flip(); //resets pos to 0 to read from buffer and sets limit to what was put there + client.write(buffer); + buffer.clear(); //empties buffer and clears, ready for writing + } + + + private static void register(Selector selector, ServerSocketChannel serverSocket) + throws IOException { + + SocketChannel client = serverSocket.accept(); + client.configureBlocking(false); + client.register(selector, SelectionKey.OP_READ); + } + + + public static void main(String args[]) { + String numberArgs[] = Arrays.copyOf(args, args.length-1); + Stream<String> str = Arrays.stream(numberArgs); + + List<Integer> intArgs = str.map(x -> {return Integer.parseInt(x);}) + .collect(Collectors.toList()); + + try { + Dstore dstore = new Dstore(intArgs.get(0), intArgs.get(1), intArgs.get(2), args[3]); + } catch (IOException e) { + System.out.println("IOException " + e.getMessage()); + } + } + +} diff --git a/src/ftp/DstoreConnection.java b/src/ftp/DstoreConnection.java new file mode 100644 index 0000000000000000000000000000000000000000..90b7d34649655c1eb4fd0a221a53bb05caa95276 --- /dev/null +++ b/src/ftp/DstoreConnection.java @@ -0,0 +1,12 @@ +package ftp; + +public class DstoreConnection extends Connection { + + private Index file_index; + + + public DstoreConnection(Index file_index) { + this.file_index = file_index; + } + +} diff --git a/src/ftp/DstoreFile.java b/src/ftp/DstoreFile.java new file mode 100644 index 0000000000000000000000000000000000000000..2d79a776368e3761320119a5774360630d782a95 --- /dev/null +++ b/src/ftp/DstoreFile.java @@ -0,0 +1,11 @@ +package ftp; + +public class DstoreFile { + private String filename; + private int filesize; + + public DstoreFile(String filename, int filesize) { + this.filename = filename; + this.filesize = filesize; + } +} diff --git a/src/ftp/Index.java b/src/ftp/Index.java new file mode 100644 index 0000000000000000000000000000000000000000..7537564a4da24e10e2a66825b11c396c964ed67c --- /dev/null +++ b/src/ftp/Index.java @@ -0,0 +1,26 @@ +package ftp; + +import java.util.ArrayList; +import java.util.List; + +public class Index { + + private ArrayList<DstoreFile> files = new ArrayList<DstoreFile>(); + + + public Index() {} + + public Index(List<DstoreFile> files) { + this.files = new ArrayList<DstoreFile>(files); + } + + + public void addFile(String filename, int filesize) { + files.add(new DstoreFile(filename,filesize)); + } + + public ArrayList<DstoreFile> getIndex() { + return files; + } + +} diff --git a/src/ftp/Server.java b/src/ftp/Server.java new file mode 100644 index 0000000000000000000000000000000000000000..754bcfd84280eaabbcdfa0919c37b18087dbe2a2 --- /dev/null +++ b/src/ftp/Server.java @@ -0,0 +1,5 @@ +package ftp; + +public abstract class Server { + public abstract void handleRequests(); +}