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) ### Application CLI (Client+Server)
- Interactive mode: `java clientP2P.ClientP2P` - 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: `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) ### Application GUI (Client+Server)
- `java gui.Gui` - `java gui.Gui`

View File

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

View File

@ -45,20 +45,29 @@ public abstract class ServerManagement extends ServeErrors implements Runnable {
protected Logger logger; protected Logger logger;
protected String baseDirectory; protected String baseDirectory;
protected HostItem server; protected HostItem server;
protected HostItem serverBinding;
protected HostItem tracker; protected HostItem tracker;
protected Random punisher = new Random(); protected Random punisher = new Random();
protected RatioWatcher ratioWatcher; protected RatioWatcher ratioWatcher;
/** Constructor */ /** Constructor
public ServerManagement(String baseDirectory, HostItem server, HostItem tracker, Logger logger) { * @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(); super();
assert baseDirectory != null : "baseDirectory is null"; assert baseDirectory != null : "baseDirectory is null";
assert serverBinding != null : "serverBinding is null";
assert server != null : "server is null"; assert server != null : "server is null";
assert tracker != null : "tracker is null"; assert tracker != null : "tracker is null";
assert logger != null : "logger is null"; assert logger != null : "logger is null";
stop = false; stop = false;
this.baseDirectory = baseDirectory; this.baseDirectory = baseDirectory;
this.server = server; this.server = server;
this.serverBinding = serverBinding;
this.tracker = tracker; this.tracker = tracker;
this.logger = logger; this.logger = logger;
} }

View File

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

View File

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