Add client implementation + update doc

pull/1/head
Louis Royer 5 years ago
parent acaa363153
commit 192f0a2c94

@ -1 +1 @@
<mxfile host="www.draw.io" modified="2020-01-12T21:18:15.190Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" etag="AragDVgr5JVvbnQoNFHI" version="12.5.1" type="device"><diagram id="MxademQTiYvtQCVb_gz8" name="Page-1">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</diagram></mxfile>
<mxfile host="www.draw.io" modified="2020-01-12T22:28:59.744Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" etag="NNaHYQiNJ1kfl6GISq3f" version="12.5.1" type="device"><diagram id="MxademQTiYvtQCVb_gz8" name="Page-1">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</diagram></mxfile>

@ -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();
}
}

@ -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() {
}
}

@ -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());
}

@ -0,0 +1,2 @@
package exception;
public class TransmissionError extends Exceptions {}
Loading…
Cancel
Save