sessions, fonctionnent (dans certains cas précis, de manière limitée dans le temps).
137 line
4.3 KiB
Java
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();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|