From 192f0a2c9470cc34910c694a43e888c5a3bb1f1e Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 12 Jan 2020 23:29:49 +0100 Subject: [PATCH] Add client implementation + update doc --- doc/classdiagram.xml | 2 +- src/client/Client.java | 31 +++++- src/client/ClientManagement.java | 17 ---- src/client/ClientManagementUDP.java | 140 +++++++++++++++++++++++++++ src/exception/TransmissionError.java | 2 + 5 files changed, 173 insertions(+), 19 deletions(-) delete mode 100644 src/client/ClientManagement.java create mode 100644 src/client/ClientManagementUDP.java create mode 100644 src/exception/TransmissionError.java diff --git a/doc/classdiagram.xml b/doc/classdiagram.xml index e6dfb8c..9bc3e48 100644 --- a/doc/classdiagram.xml +++ b/doc/classdiagram.xml @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/client/Client.java b/src/client/Client.java index 3005e2a..3d60b9d 100644 --- a/src/client/Client.java +++ b/src/client/Client.java @@ -1,10 +1,39 @@ package client; public class Client { + private String host; + private int port; + private String directory; public Client() { - + host = "localhost"; + port = 40000; + String d; + /* Follow XDG Base Directory Specification + * https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + */ + if (System.getProperty("os.name").equals("Linux")) { + d = System.getenv().get("XDG_DATA_HOME"); + if (d == null || f.equals("")) { + d = System.getenv().get("HOME"); + if (d != null && (!f.equals(""))) { + d += "/.local/share"; + } else { + d += "." + } + } + } else { + d = "."; + } + d += "P2P_JAVA_PROJECT_CLIENT/"; + // create directory if not already exists + new File(d).mkdirs(); + } } public static void main(String [] args) { Client c = new Client("client"); + ClientManagementUDP cm = new ClientManagementUDP(c.directory, c.host, c.port); + Thread t = new Thread(cm); + t.setName("client P2P-JAVA-PROJECT"); + t.start(); } } diff --git a/src/client/ClientManagement.java b/src/client/ClientManagement.java deleted file mode 100644 index 967d31a..0000000 --- a/src/client/ClientManagement.java +++ /dev/null @@ -1,17 +0,0 @@ -package client; -import exception.NotFound; - -public class ClientManagment { - private String baseDirectory; - public ClientManagment(String baseDirectory) { - this.baseDirectory = baseDirectory; - } - - public void download(String filename) throws NotFound { - } - - public String listDirectory() { - - } - -} diff --git a/src/client/ClientManagementUDP.java b/src/client/ClientManagementUDP.java new file mode 100644 index 0000000..6dc1a4f --- /dev/null +++ b/src/client/ClientManagementUDP.java @@ -0,0 +1,140 @@ +package client; +import exception.NotFound; +import exception.ProtocolError; +import exception.InternalError; +import exception.TransmissionError; +import java.utils.Scanner; +import java.net.InetAddress; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.io.File; +import java.io.IOException; + +/** Implementation of P2P-JAVA-PROJECT VERSION 1.0 protocol for UDP. + * @author Louis Royer + * @author Flavien Haas + * @author JS Auge + * @version 1.0 + */ +public class ClientManagmentUDP implements Runnable { + private String baseDirectory; + private int UDPPort; + private String host; + private final String protocolID = "P2P-JAVA-PROJECT VERSION 1.0"; + + + /** Constructor for UDP implementation, with baseDirectory and UDPPort parameters. + * @param baseDirectory the root directory where files are stored + * @param UDPPort the server will listen on this port + */ + public ClientManagmentUDP(String baseDirectory, String host, int UDPPort) { + this.baseDirectory = baseDirectory; + this.host = host; + this.UDPPort = UDPPort; + } + + /** Implementation of Runnable + */ + public void run() { + System.out.println("Files present on the server:"); + try { + String msg = sendMsg(sendFileList()); + System.out.println(listDirectory(msg)); + System.out.println("Name of the file to download:"); + Scanner scanner = new Scanner(System.in); + f = scanner.nextLine(); + msg = sendMsg(sendDownloadRequest(f)); + download(msg, f); + } catch (ProtocolError e) { + System.out.println("Protocol error"); + } catch (NotFound e) { + System.out.println("File not found"); + } catch (InternalError e) { + System.out.println("Server internal error"); + } catch (IOException e) { + System.out.println("Cannot write to file"); + } + } + + /** Prepare request to download file + * @param filename name of the file to be downloaded + * @return request to be send + */ + private String sendDownloadRequest(String filename) { + return protocolID + "\nDOWNLOAD\n" + filename + "\n"; + } + + /** Download file. + * @param response Servers's response + * @throws NotFound + * @throws ProtocolError + * @throws InternalError + */ + private void download(String response, String filename) throws NotFound, ProtocolError, InternalError, IOException { + try { + String r[] = r.split('\n', 3); + checkProtocolID(r[0]); + String r2[] = r[1].split(' '); + if (r2[0] != "LOAD") { + throw ProtocolError; + } + int size = Integer.parseInt(r2[1]); + if (r[2].length() != size) { + throws TransmissionError; + } + FileWriter fileWriter = new FileWriter(baseDirectory + f); + fileWriter.write(r[2]); + fileWriter.close(); + + } catch (java.lang.ArrayIndexOutOfBoundsException e) { + throw ProtocolError; + } catch (ParseException e) { + throw ProtocolError; + } + } + + /** Prepare request to list files on server + * @return request to be send + */ + private String sendListDirectoryRequest() { + return protocolID + "\nLIST\n"; + } + + /** Parse list of directory response from server + * @param response server's response + * @return list of files, separated by CRLF + * @throws ProtocolError + */ + private String listDirectory(String response) throws ProtocolError { + try { + String r[] = r.split('\n'); + checkProtocolID(r[0]); + return r.split(protocolID + "\nLOAD \n")[1]; + } catch (java.lang.ArrayIndexOutOfBoundsException e) { + throw ProtocolError; + } + } + + /** Check client's protocol identifier matches message's protocol identifier. + * Throws a ProtocolError if mismatched. + * @param msgProtocolID part of the request containing protocol identifier + * @throws ProtocolError + */ + private void checkProtocolID(String msgProtocolID) throws ProtocolError { + if (protocolID != msgProtocolID) { + throw ProtocolError; + } + } + + /** Send message to server + * @param msg message to be send + * @return server's response + */ + private String sendMsg(String msg) { + InetAddress dst = InetAddress.getByName(host); + byte [] bytesString = msg.getBytes(); + DatagramPacket emission = new DatagramPacket(bytesString, bytesString.length, dst, UDPPort); + socket.send(emission); + socket.receive(reception); + return new String(reception.getData(), 0, reception.getLength()); +} diff --git a/src/exception/TransmissionError.java b/src/exception/TransmissionError.java new file mode 100644 index 0000000..67a01c7 --- /dev/null +++ b/src/exception/TransmissionError.java @@ -0,0 +1,2 @@ +package exception; +public class TransmissionError extends Exceptions {}