Projet_POO/Projet_POO/src/clavardage/gestionnaireClavardage.java
benassai 6832c6be03 Interface graphique + gestion des noms, de la liste de nom, et des
sessions, fonctionnent (dans certains cas précis, de manière limitée
dans le temps).
2020-12-07 16:51:31 +01:00

137 line
4.3 KiB
Java

package clavardage;
import java.awt.EventQueue;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import nom.GestionnaireNom;
import reseau.*;
import ui.DiscussionUI;
public class gestionnaireClavardage implements Runnable{
public static final int PORT_REQUETE_NOUVELLE_SESSION = 19999;
public static final int BACKLOG = 10;
private static gestionnaireClavardage uniqueInstance = null;
private ArrayList<SessionClavardage> sessions = new ArrayList<SessionClavardage>();
private TCPServer requestServer;
private Thread thread;
public static gestionnaireClavardage instance() {
if (uniqueInstance == null) {
uniqueInstance = new gestionnaireClavardage(BACKLOG);
}
return gestionnaireClavardage.uniqueInstance;
}
//Ajouter la supppression des sessions de la liste après déconnexion
//Remplacer par un singleton
private gestionnaireClavardage(int backlog) {
GestionnaireNom gn = GestionnaireNom.instance();
this.requestServer = new TCPServer("localhost", backlog, PORT_REQUETE_NOUVELLE_SESSION + Integer.parseInt(gn.getId()));
this.thread = new Thread(this);
this.thread.start();
}
public void createSession(String name) {
GestionnaireNom gn = GestionnaireNom.instance();
TCPClient client = new TCPClient(gn.ipFromNom(name), PORT_REQUETE_NOUVELLE_SESSION + Integer.parseInt(gn.idFromNom(name))) ;
SessionClavardage session = new SessionClavardage(gn.getId(), gn.idFromNom(name), client, null);
this.sessions.add(session);
client.send(gn.getId()+"\n");
System.out.print("Paramètres de session envoyée à " + gn.idFromNom(name) + "\n");
//Lancement de la fenêtre de session
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DiscussionUI frame = new DiscussionUI(session);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ArrayList<SessionClavardage> getSessions() {
return this.sessions;
}
public void fermerSessions() {
for (SessionClavardage s : this.sessions) {
s.stop();
}
}
public void printSessions() {
for (SessionClavardage s : sessions) {
System.out.print(s);
}
}
public void run() {
GestionnaireNom gn = GestionnaireNom.instance();
while (true) {
Socket ssocket = this.requestServer.accept();
System.out.print("Données reçues sur le serveur de " + gn.getId() + "\n");
for (SessionClavardage s : this.sessions) System.out.print(s);
TCPServerThread client = new TCPServerThread(ssocket,false);
String idClient = null;
try {
idClient = client.receive();
}
catch (IOException e) {
client.stop();
}
Thread t = new Thread(client);
t.start();
int i = 0;
while (idClient != null && i<this.sessions.size() && !this.sessions.get(i).getIdDestination().equals(idClient)) {
i+=1;
}
if (idClient == null);
else if (i >= this.sessions.size()) {
//Il n'existe pas encore de session entre les deux utilisateurs
System.out.print("Nouvelle session sur le serveur de " + gn.getId() + "\n");
TCPClient clientEnvoi = new TCPClient(client.getAdresseCible(), PORT_REQUETE_NOUVELLE_SESSION + Integer.parseInt(idClient));
SessionClavardage session = new SessionClavardage(gn.getId(), idClient, clientEnvoi, client);
this.sessions.add(session);
clientEnvoi.send(gn.getId()+"\n");
System.out.print("Fin de la configuration de " + gn.getId() + "\n");
//Lancement de la fenêtre de session
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DiscussionUI frame = new DiscussionUI(session);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
else if (this.sessions.get(i).getClientReception() == null) {
System.out.print("Suite de la configuration sur le serveur de " + gn.getId() + "\n");
//il existe une session entre les deux utilisateurs, mais la phase de configuration n'est pas terminée
this.sessions.get(i).setClientReception(client);
System.out.print("Fin de la configuration de " + gn.getId() + "\n");
}
else {
//Il existe déjà une connexion établie entre les deux machines
System.out.print("Tentative de session multiple sur le serveur de " + gn.getId() + "\n");
client.stop();
}
}
}
}