1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
public class Server {
public static void main(String[] zero) {
ServerSocket socketServer;
Socket clientA = null, clientB = null;
InetAddress serverAddress;
try {
//Création d'une nouvelle socket serveur
socketServer = new ServerSocket(4002);
System.out.println("Le serveur écoute sur le port " + socketServer.getLocalPort());
//Récupération de l'adresse IP du serveur
serverAddress = InetAddress.getLocalHost();
//Indique à l'écran l'adresse du serveur
System.out.println("L'adresse du serveur est " + serverAddress);
//Attend les demandes de connexions de clients
Thread relationThread = null;
while(true){
//Le 1er client connecté sera le Client A
if(clientA == null){
clientA = socketServer.accept();
System.out.println("Client A est connecté et se trouve sur le port " + clientA.getPort());
}
//Le 2ème client connecté sera le Client B
if(clientB == null){
clientB = socketServer.accept();
System.out.println("Client B est connecté et se trouve sur le port " + clientB.getPort());
}
//Si les 2 clients sont connectés
if(clientA.isConnected() & clientB.isConnected()){
//Ils peuvent créer une relation si celle-ci n'existe pas
if(relationThread == null){
relationThread = new Thread(new Relation(socketServer, clientA, clientB));
relationThread.start();
System.out.println("La relation entre A et B est établie");
}
}
}
}catch (UnknownHostException e){ e.printStackTrace();
}catch (IOException e) { e.printStackTrace(); }
}
}
class Relation implements Runnable{
private Socket clientA, clientB;
private ServerSocket serverSocket;
private Thread clientAtoB, clientBtoA;
public Relation(ServerSocket serverSocket, Socket clientA, Socket clientB) {
this.serverSocket = serverSocket;
this.clientA = clientA;
this.clientB = clientB;
}
@Override
public void run() {
try {
//Init thread communication A to B
clientAtoB = new Thread(new RelationInputStream(serverSocket, clientA, clientB));
//Init thread communication B to A
clientBtoA = new Thread(new RelationInputStream(serverSocket, clientB, clientA));
//Start threads
clientAtoB.start();
clientBtoA.start();
} catch (Exception e) { e.printStackTrace(); }
}
}
class RelationInputStream implements Runnable{
private ServerSocket serverSocket;
private Socket clientFrom, clientTo;
private BufferedReader reader;
private PrintWriter write;
public RelationInputStream(ServerSocket serverSocket, Socket clientFrom, Socket clientTo) {
this.serverSocket = serverSocket;
this.clientFrom = clientFrom;
this.clientTo = clientTo;
}
@Override
public void run() {
String message;
try {
reader = new BufferedReader(new InputStreamReader(this.clientFrom.getInputStream()));
while(true){
message = reader.readLine();
write = new PrintWriter(clientTo.getOutputStream());
write.println(message);
write.flush();
}
} catch (IOException e) { e.printStackTrace(); }
}
} |