Merge pull request 'Add a way to use with nat' (#129) from nat into master

This commit is contained in:
Louis Royer 2020-04-14 15:35:25 +02:00
commit 1d9017326b
5 changed files with 98 additions and 38 deletions

View File

@ -14,6 +14,7 @@ Documentation of the protocol used can be found in [doc/protocol.md](doc/protoco
### Application CLI (Client+Server)
- Interactive mode: `java clientP2P.ClientP2P`
- CLI Arguments mode: `java clientP2P.ClientP2P -- <clientTransportProtocol> <integratedServerHOSTNAME> <integratedServerPORT> <trackerHOSTNAME> <trackerPORT>` (default tracker port 6969 (range 7000 -> 7999) and server port: server 7070 (range 7000->7070))
- CLI Arguments mode when using with a nat: `java clientP2P.ClientP2P -- <clientTransportProtocol> <integratedServerPublicHOSTNAME> <integratedServerPublicPORT> <trackerHOSTNAME> <trackerPORT> <serverBindingHOSTNAME> <serverBindingPORT>` (default tracker port 6969 (range 7000 -> 7999) and server port: server 7070 (range 7000->7070))
### Application GUI (Client+Server)
- `java gui.Gui`

View File

@ -29,6 +29,7 @@ public class ClientP2P {
private Directories directories;
private HostItem tracker;
private HostItem server;
private HostItem serverBinding;
private Scanner scanner;
final static boolean DEBUG = false;
@ -46,14 +47,17 @@ public class ClientP2P {
}
/** Constructor.
* @param hostnameServer hostname to bind
* @param portServer port to bind
* @param hostnameServer hostname used to register
* @param portServer port used to register
* @param hostnameServerBinding hostname to bind
* @param portServerBinding port to bind
* @param hostnameTracker hostname of tracker
* @param portTracker port of tracker
*/
public ClientP2P(String hostnameServer, int portServer, String hostnameTracker, int portTracker) {
public ClientP2P(String hostnameServer, int portServer, String hostnameServerBinding, int portServerBinding, String hostnameTracker, int portTracker) {
scanner = new Scanner(System.in);
server = new HostItem(hostnameServer, portServer);
serverBinding = new HostItem(hostnameServerBinding, portServerBinding);
tracker = new HostItem(hostnameTracker, portTracker);
initDirectoriesAndLoggers();
System.out.println("Server will listen on port " + portServer + " and serve files from " + directories.getDataHomeDirectory());
@ -72,6 +76,12 @@ public class ClientP2P {
"<clientTransportProtocol> " +
"<integratedServerHOSTNAME> <integratedServerPORT> " +
"<trackerHOSTNAME> <trackerPORT> ");
System.out.println("or");
System.out.println("\tjava clientP2P.ClientP2P -- " +
"<clientTransportProtocol> " +
"<integratedServerPublicHOSTNAME> <integratedServerPublicPORT> " +
"<trackerHOSTNAME> <trackerPORT> " +
"<integratedServerBindingHOSTNAME> <integratedServerBindingPORT>");
System.out.println("(" + trackerPortRange + " and " + serverPortRange +")");
}
@ -82,6 +92,8 @@ public class ClientP2P {
*/
public static void main(String [] args) {
final String defaultHostname = "localhost";
String hostnameServBind = "";
int portServBind = 0;
String hostnameServer = "";
int portServer = 0;
String hostnameTracker = "";
@ -91,16 +103,25 @@ public class ClientP2P {
final ServerPortRange serverPortRange = new ServerPortRange();
final TrackerPortRange trackerPortRange = new TrackerPortRange();
if ((args.length != 6) && (args.length != 0)) {
if ((args.length != 6) && (args.length != 0) && (args.length != 8)) {
ClientP2P.printUsage(serverPortRange, trackerPortRange);
System.exit(1);
}
else if (args.length == 6) {
protocolClient = args[1];
hostnameServer = args[2];
portServer = Integer.valueOf(Integer.parseInt(args[3]));
hostnameTracker = args[4];
portTracker = Integer.valueOf(Integer.parseInt(args[5]));
} else if (args.length == 6) {
protocolClient = args[1];
hostnameServer = args[2];
portServer = Integer.valueOf(Integer.parseInt(args[3]));
hostnameTracker = args[4];
portTracker = Integer.valueOf(Integer.parseInt(args[5]));
hostnameServBind = hostnameServer;
portServBind = portServer;
} else if (args.length == 8) {
protocolClient = args[1];
hostnameServer = args[2];
portServer = Integer.valueOf(Integer.parseInt(args[3]));
hostnameTracker = args[4];
portTracker = Integer.valueOf(Integer.parseInt(args[5]));
hostnameServBind = args[6];
portServBind = Integer.valueOf(Integer.parseInt(args[7]));
} else {
System.out.println("Client, wich transport protocol do you want to use (default = TCP): ");
protocolClient = scanner.nextLine();
@ -132,19 +153,22 @@ public class ClientP2P {
} else {
portTracker = Integer.valueOf(Integer.parseInt(portTrackerStr));
}
hostnameServBind = hostnameServer;
portServBind = portServer;
}
boolean serverInRange = serverPortRange.isPortInRange(portServer);
boolean serverBindInRange = serverPortRange.isPortInRange(portServBind);
boolean trackerInRange = trackerPortRange.isPortInRange(portTracker);
if (serverInRange && trackerInRange) {
if (serverInRange && trackerInRange & serverBindInRange) {
System.out.println("using hostname : " + hostnameServer);
System.out.println("using port : " + portServer);
System.out.println("tracker hostname : " + hostnameTracker);
System.out.println("tracker port : " + portTracker);
ClientP2P c = new ClientP2P(hostnameServer, portServer, hostnameTracker, portTracker);
ServerManagementUDP smudp = new ServerManagementUDP(c.directories.getDataHomeDirectory(), c.server, c.tracker, c.loggerServer);
ServerManagementTCP smtcp = new ServerManagementTCP(c.directories.getDataHomeDirectory(), c.server, c.tracker, c.loggerServer);
ClientP2P c = new ClientP2P(hostnameServer, portServer, hostnameServBind, portServBind, hostnameTracker, portTracker);
ServerManagementUDP smudp = new ServerManagementUDP(c.directories.getDataHomeDirectory(), c.serverBinding, c.server, c.tracker, c.loggerServer);
ServerManagementTCP smtcp = new ServerManagementTCP(c.directories.getDataHomeDirectory(), c.serverBinding, c.server, c.tracker, c.loggerServer);
Thread tudp = new Thread(smudp);
tudp.setName("server UDP P2P-JAVA-PROJECT");
tudp.start();
@ -193,6 +217,9 @@ public class ClientP2P {
if (!trackerInRange) {
System.err.println("TRACKER: Port not in range. " + trackerPortRange);
}
if (!serverBindInRange) {
System.err.println("SERVER-BINDING: Port not in range. " + serverPortRange);
}
System.exit(2);
}
}

View File

@ -45,20 +45,29 @@ public abstract class ServerManagement extends ServeErrors implements Runnable {
protected Logger logger;
protected String baseDirectory;
protected HostItem server;
protected HostItem serverBinding;
protected HostItem tracker;
protected Random punisher = new Random();
protected RatioWatcher ratioWatcher;
/** Constructor */
public ServerManagement(String baseDirectory, HostItem server, HostItem tracker, Logger logger) {
/** Constructor
* @param baseDirectory the root directory where files are stored
* @param serverBinding ther server will bind on this hostItem
* @param server the server hostItem used to register on tracker
* @param logger Logger item
* @param tracker Tracker
*/
public ServerManagement(String baseDirectory, HostItem serverBinding, HostItem server, HostItem tracker, Logger logger) {
super();
assert baseDirectory != null : "baseDirectory is null";
assert serverBinding != null : "serverBinding is null";
assert server != null : "server is null";
assert tracker != null : "tracker is null";
assert logger != null : "logger is null";
stop = false;
this.baseDirectory = baseDirectory;
this.server = server;
this.serverBinding = serverBinding;
this.tracker = tracker;
this.logger = logger;
}

View File

@ -47,26 +47,37 @@ import serverP2P.FileWatcherTCP;
* @version 1.0
*/
public class ServerManagementTCP extends ServerManagement {
private ServerSocket socket;
/** Constructor for TCP implementation, with baseDirectory and TCPPort parameters.
/** Constructor for TCP implementation.
* @param baseDirectory the root directory where files are stored
* @param hostName the server will bind on this address
* @param TCPPort the server will listen on this port
* @param serverBinding ther server will bind on this hostItem
* @param server the server hostItem used to register on tracker
* @param logger Logger item
* @param tracker Tracker
*/
public ServerManagementTCP(String baseDirectory, HostItem serverBinding, HostItem server, HostItem tracker, Logger logger) {
super(baseDirectory, serverBinding, server, tracker, logger);
initSocket();
}
/** Constructor for TCP implementation.
* @param baseDirectory the root directory where files are stored
* @param server the server hostItem used to register on tracker
* @param logger Logger item
* @param tracker Tracker
*/
public ServerManagementTCP(String baseDirectory, HostItem server, HostItem tracker, Logger logger) {
super(baseDirectory, server, tracker, logger);
assert baseDirectory != null : "baseDirectory is null";
assert server != null : "server is null";
assert tracker != null : "tracker is null";
assert logger != null : "logger is null";
super(baseDirectory, server, server, tracker, logger);
initSocket();
}
/** Initialize socket */
private void initSocket() {
try {
socket = new ServerSocket(server.getPort(), 10, server.getInetAddress());
socket = new ServerSocket(serverBinding.getPort(), 10, serverBinding.getInetAddress());
} catch (SocketException e) {
writeLog("Error: cannot listen on " + server, LogLevel.Error);
writeLog("Error: cannot listen on " + serverBinding, LogLevel.Error);
System.exit(-1);
} catch (IOException e) {
writeLog("Error: cannot openning socket", LogLevel.Error);

View File

@ -47,23 +47,35 @@ public class ServerManagementUDP extends ServerManagement {
private DatagramSocket socket;
/** Constructor for UDP implementation, with baseDirectory and UDPPort parameters.
/** Constructor for UDP implementation.
* @param baseDirectory the root directory where files are stored
* @param hostName the server will bind on this address
* @param port the server will listen on this port
* @param server the server hostItem used to register on tracker
* @param logger Logger item
* @param tracker Tracker
*/
public ServerManagementUDP(String baseDirectory, HostItem server, HostItem tracker, Logger logger) {
super(baseDirectory, server, tracker, logger);
assert baseDirectory != null : "baseDirectory is null";
assert server != null : "server is null";
assert tracker != null : "tracker is null";
assert logger != null : "logger is null";
super(baseDirectory, server, server, tracker, logger);
initSocket();
}
/** Constructor for UDP implementation.
* @param baseDirectory the root directory where files are stored
* @param serverBinding ther server will bind on this hostItem
* @param server the server hostItem used to register on tracker
* @param logger Logger item
* @param tracker Tracker
*/
public ServerManagementUDP(String baseDirectory, HostItem serverBinding, HostItem server, HostItem tracker, Logger logger) {
super(baseDirectory, serverBinding, server, tracker, logger);
initSocket();
}
/** Initialize socket */
private void initSocket() {
try {
socket = new DatagramSocket(server.getPort(), server.getInetAddress());
socket = new DatagramSocket(serverBinding.getPort(), serverBinding.getInetAddress());
} catch (SocketException e) {
logger.writeUDP("Error: cannot listen on " + server, LogLevel.Error);
logger.writeUDP("Error: cannot listen on " + serverBinding, LogLevel.Error);
System.exit(-1);
}
}