@ -2,14 +2,17 @@ package clientP2P;
import java.util.Scanner ;
import java.util.List ;
import javafx.util.Pair ;
import clientP2P.ClientManagementUDP ;
import clientP2P.ClientManagementTCP ;
import serverP2P.ServerManagementUDP ;
import serverP2P.ServerManagementTCP ;
import tools.Logger ;
import tools.LogLevel ;
import tools.Directories ;
import tools.HostItem ;
import tools.TestPort ;
/ * * Client + Server implementation .
* @author Louis Royer
@ -23,20 +26,17 @@ public class ClientP2P {
private String partsDir = ".parts/" ;
private Logger loggerServer ;
private Logger loggerClient ;
private String host ;
private int port ;
private int portServer ;
private Directories directories ;
private static final int defaultPort = 20000 ;
private HostItem tracker ;
private Scanner scanner ;
/ * * Initialize loggers if directories and logger are null ,
* else fail silently .
* /
public void initDirectoriesAndLoggers ( ) {
if ( directories = = null & & loggerServer = = null & & loggerClient = = null ) {
directories = new Directories ( "P2P_JAVA_PROJECT_" + port ) ;
directories = new Directories ( "P2P_JAVA_PROJECT_" + port Server ) ;
directories . createSubdir ( logDir ) ;
loggerServer = new Logger ( directories . getDataHomeDirectory ( ) + logDir + "server.log" ) ;
loggerClient = new Logger ( directories . getDataHomeDirectory ( ) + logDir + "client.log" ) ;
@ -44,26 +44,16 @@ public class ClientP2P {
}
}
/ * * Constructor with portS tr as parameter .
* @param portS tr String containing port for server listenning .
/ * * Constructor with portS ervers tr as parameter .
* @param portS ervers tr String containing port for server listenning .
* /
public ClientP2P ( String portS tr) {
public ClientP2P ( String portS ervers tr, String hostnameTracker , String portTracke r) {
scanner = new Scanner ( System . in ) ;
tracker = new HostItem ( "localhost" , 30000 ) ; // TODO : make it configurable
try {
port = Integer . valueOf ( Integer . parseInt ( portStr ) ) ;
} catch ( NumberFormatException e ) {
int oldPort = port ;
port = defaultPort ;
initDirectoriesAndLoggers ( ) ;
System . err . println ( "Error incorrect port " + oldPort + " using default port " + defaultPort ) ;
loggerServer . write ( "incorrect port " + oldPort + " using default port " + defaultPort , LogLevel . Info ) ;
}
portServer = Integer . valueOf ( Integer . parseInt ( portServerstr ) ) ;
tracker = new HostItem ( hostnameTracker , Integer . valueOf ( Integer . parseInt ( portTracker ) ) ) ;
initDirectoriesAndLoggers ( ) ;
host = "localhost" ;
System . out . println ( "Server will listen on port " + port + " and serve files from " + directories . getDataHomeDirectory ( ) ) ;
System . out . println ( "Server will listen on port " + portServer + " and serve files from " + directories . getDataHomeDirectory ( ) ) ;
directories . askOpenDataHomeDirectory ( null , scanner ) ;
System . out . println ( "Please enter list of servers to use; first one will be used to ask list of files" ) ;
}
/ * * Main program entry point .
@ -72,25 +62,86 @@ public class ClientP2P {
* @param args server listenning port
* /
public static void main ( String [ ] args ) {
if ( args [ 1 ] . equals ( "help" ) | | args [ 1 ] . equals ( "-h" ) | | args [ 1 ] . equals ( "h" ) ) {
System . out . println ( "usage : java clientP2P.ClientP2P or java clientP2P.ClientP2P -- <integratedServerPORT> <trackerHOSTNAME> <trackerPORT> (default for integratedServer localhost:7070 and tracker localhost:6969, range 7000 -> 7999)" ) ;
final String defaultHostname = "localhost" ;
final String defaultPortServer = "7070" ;
final String defaultPortTracker = "6969" ;
String hostnameServer = "" ;
String portServer = "" ;
String hostnameTracker = "" ;
String portTracker = "" ;
String protocolClient = "" ;
Scanner scanner = new Scanner ( System . in ) ;
TestPort testPort = new TestPort ( ) ;
if ( ( args . length ! = 6 ) & & ( args . length ! = 0 ) ) {
System . out . println ( "usage : java clientP2P.ClientP2P or java clientP2P.ClientP2P -- <clientTransportProtocol> <integratedServerHOSTNAME> <integratedServerPORT> <trackerHOSTNAME> <trackerPORT> (default tracker port 6969 (range 7000 -> 7999) and server port: server 7070 (range 7000->7070))" ) ;
}
else {
ClientP2P c ;
try {
c = new ClientP2P ( args [ 1 ] ) ;
} catch ( IndexOutOfBoundsException e ) {
c = new ClientP2P ( "" + defaultPort ) ;
if ( args . length = = 6 ) {
protocolClient = args [ 1 ] ;
hostnameServer = args [ 2 ] ;
portServer = args [ 3 ] ;
hostnameTracker = args [ 4 ] ;
portTracker = args [ 5 ] ;
}
else {
System . out . println ( "Client, wich transport protocol do you want to use (default = TCP): " ) ;
protocolClient = scanner . nextLine ( ) ;
System . out . println ( "server side, enter hostname to bind (default = localhost): " ) ;
hostnameServer = scanner . nextLine ( ) ;
if ( hostnameServer . equals ( "" ) ) {
hostnameServer = defaultHostname ;
System . out . println ( "using default hostname : " + hostnameServer ) ;
}
System . out . println ( "enter port (default = 7070): " ) ;
portServer = scanner . nextLine ( ) ;
if ( portServer . equals ( "" ) ) {
portServer = defaultPortServer ;
System . out . println ( "using default port : " + portServer ) ;
}
System . out . println ( "enter hostname of tracker (default = localhost): " ) ;
hostnameTracker = scanner . nextLine ( ) ;
if ( hostnameTracker . equals ( "" ) ) {
hostnameTracker = defaultHostname ;
System . out . println ( "tracker default hostname : " + hostnameTracker ) ;
}
System . out . println ( "enter tracker's port (default = 6969): " ) ;
portTracker = scanner . nextLine ( ) ;
if ( portTracker . equals ( "" ) ) {
portTracker = defaultPortTracker ;
System . out . println ( "using default port : " + portTracker ) ;
}
}
// Server threads
ServerManagementUDP smudp = new ServerManagementUDP ( c . directories . getDataHomeDirectory ( ) , "localhost" , c . port , c . loggerServer , c . tracker ) ;
ServerManagementTCP smtcp = new ServerManagementTCP ( c . directories . getDataHomeDirectory ( ) , "localhost" , c . port , c . loggerServer , c . tracker ) ;
System . out . println ( "using hostname : " + hostnameServer ) ;
Pair < Integer , String > PtestPortServer = testPort . testPortServer ( Integer . parseInt ( portServer ) ) ;
if ( PtestPortServer . getKey ( ) = = 0 ) {
System . out . println ( "using port : " + portServer ) ;
}
else {
System . out . println ( PtestPortServer . getValue ( ) ) ;
portServer = defaultPortServer ;
}
System . out . println ( "tracker hostname : " + hostnameTracker ) ;
Pair < Integer , String > PtestPortTracker = testPort . testPortTracker ( Integer . parseInt ( portTracker ) ) ;
if ( PtestPortTracker . getKey ( ) = = 0 ) {
System . out . println ( "using port : " + portTracker ) ;
}
else {
System . out . println ( PtestPortTracker . getValue ( ) ) ;
portTracker = defaultPortTracker ;
}
ClientP2P c = new ClientP2P ( portServer , hostnameTracker , portTracker ) ;
ServerManagementUDP smudp = new ServerManagementUDP ( c . directories . getDataHomeDirectory ( ) , hostnameServer , c . portServer , c . loggerServer , c . tracker ) ;
ServerManagementTCP smtcp = new ServerManagementTCP ( c . directories . getDataHomeDirectory ( ) , hostnameServer , c . portServer , c . loggerServer , c . tracker ) ;
Thread tudp = new Thread ( smudp ) ;
tudp . setName ( "server UDP P2P-JAVA-PROJECT (port: " + c . port + ")" ) ;
tudp . setName ( "server UDP P2P-JAVA-PROJECT ") ;
tudp . start ( ) ;
Thread ttcp = new Thread ( smtcp ) ;
ttcp . setName ( "server TCP P2P-JAVA-PROJECT (port: " + c . port + ")" ) ;
ttcp . setName ( "server TCP P2P-JAVA-PROJECT ") ;
ttcp . start ( ) ;
// Wait a bit before printing client interface
@ -101,19 +152,15 @@ public class ClientP2P {
Thread . currentThread ( ) . interrupt ( ) ;
}
// initialize Host lists
System . out . println ( "Client : Which transport protocol do you want to use? [TCP/udp]" ) ;
c . scanner . hasNextLine ( ) ;
String transportchoosen = c . scanner . nextLine ( ) ;
Thread t ;
switch ( transportchoosen ) {
Thread tclient ;
switch ( protocolClient ) {
case "UDP" :
case "udp" :
case "upd" : // alias typo
case "upd" :
case "2" :
System . out . println ( "Starting with UDP" ) ;
ClientManagementUDP cmudp = new ClientManagementUDP ( c . directories . getDataHomeDirectory ( ) , c . tracker , c . directories . getDataHomeDirectory ( ) + c . partsDir , c . loggerClient , c . scanner ) ;
t = new Thread ( cmudp ) ;
t client = new Thread ( cmudp ) ;
break ;
case "TCP" :
case "tcp" :
@ -121,18 +168,16 @@ public class ClientP2P {
default :
System . out . println ( "Starting with TCP" ) ;
ClientManagementTCP cmtcp = new ClientManagementTCP ( c . directories . getDataHomeDirectory ( ) , c . tracker , c . directories . getDataHomeDirectory ( ) + c . partsDir , c . loggerClient , c . scanner ) ;
t = new Thread ( cmtcp ) ;
t client = new Thread ( cmtcp ) ;
break ;
}
t . setName ( "client P2P-JAVA-PROJECT" ) ;
t . start ( ) ;
}
t client . setName ( "client P2P-JAVA-PROJECT" ) ;
t client . start ( ) ;
try {
t . join ( ) ;
t client . join ( ) ;
} catch ( InterruptedException e ) { }
c . scanner . close ( ) ;
smudp . setStop ( ) ;
smtcp . setStop ( ) ;
}
}
}