Nettoyage du code

このコミットが含まれているのは:
Auriane Lartigue 2021-01-30 13:49:03 +01:00
コミット 4f47290542
18個のファイルの変更318行の追加276行の削除

ファイルの表示

@ -1,6 +1,5 @@
package chatapp.Controller; package chatapp.Controller;
import chatapp.Model.DataBase;
import chatapp.Model.ListUtilisateurs; import chatapp.Model.ListUtilisateurs;
import chatapp.Model.Utilisateur; import chatapp.Model.Utilisateur;
import chatapp.Protocol.*; import chatapp.Protocol.*;
@ -30,20 +29,34 @@ public class ChatApp implements PropertyChangeListener {
/* Liste des utilisateurs actifs */ /* Liste des utilisateurs actifs */
private ListUtilisateurs actifUsers ; private ListUtilisateurs actifUsers ;
private boolean isExterne; // TRUE si l'utilisateur est externe au reseau FALSE s'il est interne /* TRUE si l'utilisateur est externe au reseau FALSE s'il est interne */
private boolean isExterne;
private HttpEchange externeEchange; private HttpEchange externeEchange;
/* ChatApp est associe a un utilisateur */ /* ChatApp est associe a un utilisateur */
private Utilisateur me; private Utilisateur me;
/* ChatApp est associe a une application qui le lance et que chatapp doit fermer a la fin */ /* ChatApp est associe a une application qui le lance et que chatapp doit fermer a la fin */
private Application main; private Application main;
/* Instance de ChatApp */
private static ChatApp chatapp = null; private static ChatApp chatapp = null;
/* Gérer les multiples connexions en TCP. */
private RunnerEcouteTCP runnerEcouteTCP; private RunnerEcouteTCP runnerEcouteTCP;
/* Gérer les multiples connexions en UDP. */
private RunnerEcouteUDP runnerEcouteUDP; private RunnerEcouteUDP runnerEcouteUDP;
/* TRUE si l'utilisateur est connecte au reseau FALSE sinon */
private boolean connecte; private boolean connecte;
/* Acces a la base de donnée */
//private DataBase db; //private DataBase db;
public ArrayList<String> ListeCommunication = new ArrayList<>();
/* Variable stockant les communications grâce aux IDs des utilisateurs */
public ArrayList<String> listeCommunication = new ArrayList<>();
/** /**
* <p> Getter : Connecte * <p> Getter : Connecte
@ -62,8 +75,7 @@ public class ChatApp implements PropertyChangeListener {
*/ */
public ChatApp(String pseudo, Integer port, Application main){ public ChatApp(String pseudo, Integer port, Application main){
this.actifUsers = new ListUtilisateurs() ; this.actifUsers = new ListUtilisateurs() ;
// Recuperer adresse IP de l'utilisateur InetAddress ip = UDPEchange.getCurrentIp(); // Recuperer adresse IP de l'utilisateur
InetAddress ip = UDPEchange.getCurrentIp();
this.me = new Utilisateur(pseudo,port,ip); this.me = new Utilisateur(pseudo,port,ip);
this.actifUsers.addList(getMe()); this.actifUsers.addList(getMe());
this.main = main; this.main = main;
@ -144,9 +156,9 @@ public class ChatApp implements PropertyChangeListener {
* @return False si modiferPseudo a échoué, True sinon * @return False si modiferPseudo a échoué, True sinon
*/ */
public Boolean modifierPseudoInterne(String nouveau) throws IOException { public Boolean modifierPseudoInterne(String nouveau) throws IOException {
// Message que l'on envoie à tous les utilisateurs actifs // Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Demande Modification Pseudo\n" + this.getMe().toString() + "\n" + nouveau + "\n"; String broadcastMessage = "Demande Modification Pseudo\n" + this.getMe().toString() + "\n" + nouveau + "\n";
UDPEchange.EnvoiBroadcast(broadcastMessage); UDPEchange.envoiBroadcast(broadcastMessage);
try { try {
Thread.sleep(2000); Thread.sleep(2000);
/* L'utilisateur doit attendre la reponse de tous les utilisateurs connectes /* L'utilisateur doit attendre la reponse de tous les utilisateurs connectes
@ -159,7 +171,7 @@ public class ChatApp implements PropertyChangeListener {
System.out.println("Modification pseudo reussi"); System.out.println("Modification pseudo reussi");
//Envoi un msg en broadcast a tout les utilisateurs pour les prevenir de son nouveau pseudo// //Envoi un msg en broadcast a tout les utilisateurs pour les prevenir de son nouveau pseudo//
broadcastMessage = "Modification pseudo reussi\n" + this.getMe().toString() + "\n" + nouveau + "\n"; broadcastMessage = "Modification pseudo reussi\n" + this.getMe().toString() + "\n" + nouveau + "\n";
UDPEchange.EnvoiBroadcast(broadcastMessage); UDPEchange.envoiBroadcast(broadcastMessage);
//-------Change son propre nom d'utilisateur-------// //-------Change son propre nom d'utilisateur-------//
this.getActifUsers().modifierList(this.getMe().getPseudo(), nouveau); this.getActifUsers().modifierList(this.getMe().getPseudo(), nouveau);
this.getMe().setPseudo(nouveau); this.getMe().setPseudo(nouveau);
@ -226,10 +238,10 @@ public class ChatApp implements PropertyChangeListener {
* @throws IOException * @throws IOException
*/ */
public Boolean connexionInterne(String pseudo) throws IOException { public Boolean connexionInterne(String pseudo) throws IOException {
// Message que l'on envoie à tous les utilisateurs actifs // Message que l'on envoie à tous les utilisateurs actifs
this.me.setPseudo(pseudo); this.me.setPseudo(pseudo);
String broadcastMessage = "Connexion\n" + this.getMe().toString() ; String broadcastMessage = "Connexion\n" + this.getMe().toString() ;
UDPEchange.EnvoiBroadcast(broadcastMessage); UDPEchange.envoiBroadcast(broadcastMessage);
try { try {
Thread.sleep(2000); // L'utilisateur doit attendre la reponse de tous les utilisateurs connectes Thread.sleep(2000); // L'utilisateur doit attendre la reponse de tous les utilisateurs connectes
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -297,8 +309,7 @@ public class ChatApp implements PropertyChangeListener {
* *
*/ */
private void deconnexionExterne() throws IOException{ private void deconnexionExterne() throws IOException{
// A IMPLEMENTER System.out.println("Deconnexion lancee");
System.out.println("Deco lancee");
boolean deco = false; boolean deco = false;
try { try {
deco = externeEchange.sendPost("Deconnexion"); deco = externeEchange.sendPost("Deconnexion");
@ -320,7 +331,6 @@ public class ChatApp implements PropertyChangeListener {
} }
Platform.exit(); Platform.exit();
System.exit(0); System.exit(0);
} }
@ -330,9 +340,9 @@ public class ChatApp implements PropertyChangeListener {
* @throws IOException * @throws IOException
*/ */
public void deconnexionInterne() throws IOException { public void deconnexionInterne() throws IOException {
// Message que l'on envoie à tous les utilisateurs actifs // Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Deconnexion\n" + this.getMe().toString() ; String broadcastMessage = "Deconnexion\n" + this.getMe().toString() ;
UDPEchange.EnvoiBroadcast(broadcastMessage); UDPEchange.envoiBroadcast(broadcastMessage);
//db.majUtilisateursActifs(false,this.me.getId()); //db.majUtilisateursActifs(false,this.me.getId());
this.connecte=false; this.connecte=false;
try { try {
@ -422,7 +432,7 @@ public class ChatApp implements PropertyChangeListener {
public ArrayList<Utilisateur> createListeCommunicationPossible(){ public ArrayList<Utilisateur> createListeCommunicationPossible(){
ArrayList<Utilisateur> communication = new ArrayList<>(); ArrayList<Utilisateur> communication = new ArrayList<>();
for ( Utilisateur element : this.actifUsers.getActifUsers()){ for ( Utilisateur element : this.actifUsers.getActifUsers()){
if ( ! this.ListeCommunication.contains(element.getId())){ if ( ! this.listeCommunication.contains(element.getId())){
communication.add(element); communication.add(element);
} }
} }

ファイルの表示

@ -4,14 +4,16 @@ import chatapp.Controller.ChatApp;
import javafx.application.Application; import javafx.application.Application;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Screen;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; /**
* Cette classe extends Application.
* <br> Elle va permettre de faire le lien avec JavaFX.
*/
public class Main extends Application { public class Main extends Application {
/* Instance de ChatApp */
ChatApp chatapp; ChatApp chatapp;
/** /**
@ -21,7 +23,6 @@ public class Main extends Application {
*/ */
@Override @Override
public void start(Stage primaryStage) throws Exception { public void start(Stage primaryStage) throws Exception {
//Rectangle2D tailleEcran = Screen.getPrimary().getBounds();
this.chatapp = ChatApp.getInstance("Null",1234,this); this.chatapp = ChatApp.getInstance("Null",1234,this);
FXMLLoader fichier = new FXMLLoader(getClass().getResource("/fenetres/ConnexionScreen.fxml")); FXMLLoader fichier = new FXMLLoader(getClass().getResource("/fenetres/ConnexionScreen.fxml"));
Scene scene1 = new Scene(fichier.load(),600,400); Scene scene1 = new Scene(fichier.load(),600,400);
@ -29,15 +30,10 @@ public class Main extends Application {
primaryStage.setTitle("ChatApp"); primaryStage.setTitle("ChatApp");
primaryStage.setMinWidth(600); primaryStage.setMinWidth(600);
primaryStage.setMinHeight(400); primaryStage.setMinHeight(400);
//primaryStage.setMaxWidth(600);
//primaryStage.setMaxHeight(400);
/*primaryStage.setMaxWidth(tailleEcran.getWidth());
primaryStage.setMaxHeight(tailleEcran.getHeight());*/
primaryStage.show(); primaryStage.show();
primaryStage.centerOnScreen(); primaryStage.centerOnScreen();
chatapp.activerEcouteTCP(); chatapp.activerEcouteTCP();
chatapp.activerEcouteUDP(); chatapp.activerEcouteUDP();
} }
/** /**
@ -48,8 +44,7 @@ public class Main extends Application {
public void stop() throws Exception { public void stop() throws Exception {
if(chatapp.isConnecte()){ if(chatapp.isConnecte()){
chatapp.deconnexion(); chatapp.deconnexion();
} } else {
else {
super.stop(); super.stop();
Platform.exit(); Platform.exit();
System.exit(0); System.exit(0);

ファイルの表示

@ -26,12 +26,21 @@ import java.sql.*;
* <br> - Date d'envoi : Date a laquelle Source a envoyé le message à destinataire * <br> - Date d'envoi : Date a laquelle Source a envoyé le message à destinataire
*/ */
public class DataBase { public class DataBase {
private final String DBurl = "jdbc:mysql://srv-bdens.insa-toulouse.fr:3306/tp_servlet_006?" ;
/* URL pour accéder à la BDD */
private final String dBurl = "jdbc:mysql://srv-bdens.insa-toulouse.fr:3306/tp_servlet_006?" ;
/* Connection avec la BDD */
private Connection connection = null; private Connection connection = null;
/* Login pour se connecter à la BDD */
private final String login = "tp_servlet_006"; private final String login = "tp_servlet_006";
/* Mdp pour se connecter à la BDD */
private final String pswd = "baePh9ei"; private final String pswd = "baePh9ei";
private static final DataBase instance = null; // Singleton /* Singleton */
private static final DataBase instance = null;
/** /**
* Constructeur de la database * Constructeur de la database
@ -52,7 +61,7 @@ public class DataBase {
//this.connection = DriverManager.getConnection("jdbc:mysql://localhost/POO_AL_NM?allowPublicKeyRetrieval=true&useSSL=false", "root", "1234"); //this.connection = DriverManager.getConnection("jdbc:mysql://localhost/POO_AL_NM?allowPublicKeyRetrieval=true&useSSL=false", "root", "1234");
// Auriane : DECOMMENTER CETTE LIGNE // Auriane : DECOMMENTER CETTE LIGNE
//this.connection = DriverManager.getConnection("jdbc:mysql://localhost:8889/POO_AL_NM?allowPublicKeyRetrieval=true&useSSL=false", "root", "root"); //this.connection = DriverManager.getConnection("jdbc:mysql://localhost:8889/POO_AL_NM?allowPublicKeyRetrieval=true&useSSL=false", "root", "root");
this.connection = DriverManager.getConnection(this.DBurl,login,pswd); this.connection = DriverManager.getConnection(this.dBurl,login,pswd);
System.out.println("Connexion Etablie"); System.out.println("Connexion Etablie");
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
@ -72,29 +81,29 @@ public class DataBase {
/** /**
* Methode permettant de créer une table pour stocker les messages entre deux utilisateurs * Methode permettant de créer une table pour stocker les messages entre deux utilisateurs
* @param ID1 Id du premier utilisateur * @param iD1 Id du premier utilisateur
* @param ID2 Id du second utilisateur * @param iD2 Id du second utilisateur
*/ */
public void CreationTableHistorique(String ID1 , String ID2) { public void creationTableHistorique(String iD1 , String iD2) {
// Pour eviter d'avoir les tables en double // Pour eviter d'avoir les tables en double
String petit; String petit;
String grand; String grand;
int comparaison = ID1.compareTo(ID2); int comparaison = iD1.compareTo(iD2);
if (comparaison < 0) { if (comparaison < 0) {
petit = ID1; petit = iD1;
grand = ID2 ; grand = iD2 ;
} }
else { else {
petit = ID2; petit = iD2;
grand = ID1 ; grand = iD1 ;
} }
String nomTable = "Chat_" + petit + "_" + grand ; String nomTable = "Chat_" + petit + "_" + grand ;
String Requete = "CREATE TABLE IF NOT EXISTS`" + nomTable +"` (\n" + "`Destinataire` varchar(100) NOT NULL,\n" + " `Source` varchar(100) NOT NULL,\n" + " `Envoi` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" + " `Message` text NOT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;"; String requete = "CREATE TABLE IF NOT EXISTS`" + nomTable +"` (\n" + "`Destinataire` varchar(100) NOT NULL,\n" + " `Source` varchar(100) NOT NULL,\n" + " `Envoi` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" + " `Message` text NOT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;";
System.out.println(Requete); System.out.println(requete);
PreparedStatement Ps = null ; PreparedStatement ps = null ;
//Statement est utilisé pour envoyer une requete SQL à la base de donnee //Statement est utilisé pour envoyer une requete SQL à la base de donnee
try { try {
Ps = connection.prepareStatement(Requete); ps = connection.prepareStatement(requete);
System.out.println("Statement cree"); System.out.println("Statement cree");
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
@ -102,8 +111,8 @@ public class DataBase {
} }
//Execute la donnée SQL statement passe en parametre //Execute la donnée SQL statement passe en parametre
try { try {
assert Ps != null; assert ps != null;
Ps.executeUpdate(); ps.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
System.out.println(" Echec executeUpdate "); System.out.println(" Echec executeUpdate ");
@ -112,17 +121,17 @@ public class DataBase {
/** /**
* Méthode permettant de mettre a jour le pseudo d'un utilisateur en fonction de son ID dans la base de donnee * Méthode permettant de mettre a jour le pseudo d'un utilisateur en fonction de son ID dans la base de donnee
* @param ID Id de l'utilisateur qui vient de changer de pseudo * @param iD Id de l'utilisateur qui vient de changer de pseudo
* @param Pseudo Nouveau Pseudo de l'utilisateur * @param pseudo Nouveau Pseudo de l'utilisateur
*/ */
public void majPseudo( String ID , String Pseudo) { public void majPseudo( String iD , String pseudo) {
String requete= "UPDATE `Utilisateurs` SET `Pseudo`=? WHERE id=?"; String requete= "UPDATE `Utilisateurs` SET `Pseudo`=? WHERE id=?";
PreparedStatement Ps = null ; PreparedStatement ps = null ;
//Statement est utilisé pour envoyer une requete SQL à la base de donnee //Statement est utilisé pour envoyer une requete SQL à la base de donnee
try { try {
Ps = connection.prepareStatement(requete); ps = connection.prepareStatement(requete);
Ps.setString(1, Pseudo); // ? n°1 devient la valeur contenu dans Pseudo ps.setString(1, pseudo); // ? n°1 devient la valeur contenu dans Pseudo
Ps.setString(2, ID); // ? n°2 devient la valeur contenu dans ID ps.setString(2, iD); // ? n°2 devient la valeur contenu dans ID
System.out.println("Statement cree"); System.out.println("Statement cree");
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
@ -130,8 +139,8 @@ public class DataBase {
} }
//Execute la donnée SQL statement passe en parametre //Execute la donnée SQL statement passe en parametre
try { try {
assert Ps != null; assert ps != null;
Ps.executeUpdate(); ps.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
System.out.println(" Echec executeUpdate "); System.out.println(" Echec executeUpdate ");
@ -142,31 +151,31 @@ public class DataBase {
/** /**
* Méthode permettant de mettre a jour le pseudo d'un utilisateur en fonction de son ID dans la base de donnée * Méthode permettant de mettre a jour le pseudo d'un utilisateur en fonction de son ID dans la base de donnée
* @param IDdest Id de l'utilisateur Destinataire du message * @param iDdest Id de l'utilisateur Destinataire du message
* @param IDsrc Id de celui qui envoi le message * @param iDsrc Id de celui qui envoi le message
* @param Msg Message envoye entre les deux utilisateurs * @param msg Message envoye entre les deux utilisateurs
*/ */
public void ajoutHistorique(String IDdest , String IDsrc, String Msg) { public void ajoutHistorique(String iDdest , String iDsrc, String msg) {
String petit; String petit;
String grand; String grand;
int comparaison = IDdest.compareTo(IDsrc); int comparaison = iDdest.compareTo(iDsrc);
if (comparaison < 0) { if (comparaison < 0) {
petit = IDdest; petit = iDdest;
grand = IDsrc ; grand = iDsrc ;
} }
else { else {
petit = IDsrc; petit = iDsrc;
grand = IDdest ; grand = iDdest ;
} }
String nomTable = "Chat_" + petit + "_" + grand ; String nomTable = "Chat_" + petit + "_" + grand ;
String requete= "INSERT INTO `"+ nomTable +"`(`Destinataire`, `Source`, `Message`) VALUES ( ? , ? , ?)"; String requete= "INSERT INTO `"+ nomTable +"`(`Destinataire`, `Source`, `Message`) VALUES ( ? , ? , ?)";
PreparedStatement Ps = null ; PreparedStatement ps = null ;
//Statement est utilisé pour envoyer une requete SQL à la base de donnee //Statement est utilisé pour envoyer une requete SQL à la base de donnee
try { try {
Ps = connection.prepareStatement(requete); ps = connection.prepareStatement(requete);
Ps.setString(1, IDdest); // ? n°1 devient la valeur contenu dans IDdest ps.setString(1, iDdest); // ? n°1 devient la valeur contenu dans IDdest
Ps.setString(2, IDsrc); // ? n°2 devient la valeur contenu dans IDsrc ps.setString(2, iDsrc); // ? n°2 devient la valeur contenu dans IDsrc
Ps.setString(3, Msg); // ? n°3 devient la valeur contenu dans Msg ps.setString(3, msg); // ? n°3 devient la valeur contenu dans Msg
//La date de l'envoi n'a pas besoin d'être renseigné, elle est automatique //La date de l'envoi n'a pas besoin d'être renseigné, elle est automatique
System.out.println("Statement cree"); System.out.println("Statement cree");
} catch (SQLException e) { } catch (SQLException e) {
@ -175,8 +184,8 @@ public class DataBase {
} }
//Execute la donnée SQL statement passe en parametre //Execute la donnée SQL statement passe en parametre
try { try {
assert Ps != null; assert ps != null;
Ps.executeUpdate(); ps.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
System.out.println(" Echec executeUpdate "); System.out.println(" Echec executeUpdate ");
@ -186,23 +195,23 @@ public class DataBase {
/** /**
* Méthode permettant d'ajouter un utilisateur dans la base de donnée si celui-ci n'existe pas déjà * Méthode permettant d'ajouter un utilisateur dans la base de donnée si celui-ci n'existe pas déjà
* @param ID Id de l'utilisateur que l'on veut rajouter * @param iD Id de l'utilisateur que l'on veut rajouter
* @param Pseudo Pseudo actuelle de l'utilisateur * @param pseudo Pseudo actuelle de l'utilisateur
*/ */
public void ajoutUtilisateurs(String ID , String Pseudo ) { public void ajoutUtilisateurs(String iD , String pseudo ) {
if(this.idExiste(ID)){ if(this.idExiste(iD)){
this.majPseudo(ID, Pseudo); this.majPseudo(iD, pseudo);
} }
else { else {
// L'utilisateur n'existe pas , on va le rajouter. // L'utilisateur n'existe pas , on va le rajouter.
System.out.println("On rajoute l'utilisateur " + Pseudo); System.out.println("On rajoute l'utilisateur " + pseudo);
String requete = "INSERT INTO `Utilisateurs` (`ID`, `Pseudo`, `Actif`) VALUES ( ? , ? , '1')"; String requete = "INSERT INTO `Utilisateurs` (`ID`, `Pseudo`, `Actif`) VALUES ( ? , ? , '1')";
PreparedStatement Ps = null; PreparedStatement ps = null;
//Statement est utilisé pour envoyer une requete SQL à la base de donnee //Statement est utilisé pour envoyer une requete SQL à la base de donnee
try { try {
Ps = connection.prepareStatement(requete); ps = connection.prepareStatement(requete);
Ps.setString(1, ID); // ? n°1 devient la valeur contenu dans ID ps.setString(1, iD); // ? n°1 devient la valeur contenu dans ID
Ps.setString(2, Pseudo); // ? n°2 devient la valeur contenu dans Pseudo ps.setString(2, pseudo); // ? n°2 devient la valeur contenu dans Pseudo
System.out.println("Statement cree"); System.out.println("Statement cree");
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
@ -210,8 +219,8 @@ public class DataBase {
} }
//Execute la donnée SQL statement passe en parametre //Execute la donnée SQL statement passe en parametre
try { try {
assert Ps != null; assert ps != null;
Ps.executeUpdate(); ps.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
System.out.println(" Echec executeUpdate "); System.out.println(" Echec executeUpdate ");
@ -250,23 +259,23 @@ public class DataBase {
/** /**
* Méthode permettant de récupérer les N derniers messages envoyés entre 2 utilisateurs * Méthode permettant de récupérer les N derniers messages envoyés entre 2 utilisateurs
* @param ID Utilisateur associé a ChatApp * @param iD Utilisateur associé a ChatApp
* @param IDdestinataire Celui avec qui correspond ID * @param iDdestinataire Celui avec qui correspond ID
* @param N Le nombre de messages souhaités * @param n Le nombre de messages souhaités
* @return Les N derniers Messages * @return Les N derniers Messages
*/ */
public String recupNMsg(String ID, String IDdestinataire, int N) { public String recupNMsg(String iD, String iDdestinataire, int n) {
StringBuilder Msg = new StringBuilder(); StringBuilder msg = new StringBuilder();
String petit; String petit;
String grand; String grand;
int comparaison = ID.compareTo(IDdestinataire); int comparaison = iD.compareTo(iDdestinataire);
if (comparaison < 0) { if (comparaison < 0) {
petit = ID; petit = iD;
grand = IDdestinataire; grand = iDdestinataire;
} }
else { else {
petit = IDdestinataire; petit = iDdestinataire;
grand = ID ; grand = iD ;
} }
String nomTable = "Chat_" + petit + "_" + grand ; String nomTable = "Chat_" + petit + "_" + grand ;
String requete = "SELECT * FROM `"+ nomTable +"`"; String requete = "SELECT * FROM `"+ nomTable +"`";
@ -283,23 +292,23 @@ public class DataBase {
} catch (SQLException throwables) { } catch (SQLException throwables) {
throwables.printStackTrace(); throwables.printStackTrace();
} }
Integer Taille = tailleBDD(nomTable); Integer taille = tailleBDD(nomTable);
if(Taille < N ){ if(taille < n ){
N = Taille ; n = taille ;
} }
for(int i = 0 ; i < N; i++){ for(int i = 0 ; i < n; i++){
try { try {
assert rs != null; assert rs != null;
if( rs.next()){ if( rs.next()){
String IDSource = rs.getString("Source"); String iDSource = rs.getString("Source");
String Envoi = rs.getTimestamp("Envoi").toString(); String envoi = rs.getTimestamp("Envoi").toString();
String Message = rs.getString("Message"); String message = rs.getString("Message");
if (IDSource.equals(ID)) Msg.append("Moi (").append(Envoi).append(") : ").append(Message); if (iDSource.equals(iD)) msg.append("Moi (").append(envoi).append(") : ").append(message);
else { else {
String PseudoSource = getPseudo(IDSource) ; String pseudoSource = getPseudo(iDSource) ;
Msg.append(PseudoSource).append(" (").append(Envoi).append(") : ").append(Message); msg.append(pseudoSource).append(" (").append(envoi).append(") : ").append(message);
} }
Msg.append('\n'); msg.append('\n');
} }
// MSG de la forme : // MSG de la forme :
// Source (Date) : Texte // Source (Date) : Texte
@ -307,7 +316,7 @@ public class DataBase {
throwables.printStackTrace(); throwables.printStackTrace();
} }
} }
return Msg.toString(); return msg.toString();
} }
/** /**
@ -316,7 +325,7 @@ public class DataBase {
* @return Pseudo actuel * @return Pseudo actuel
*/ */
private String getPseudo(String idSource) { private String getPseudo(String idSource) {
String Pseudo = "" ; String pseudo = "" ;
String requete= "SELECT * FROM `Utilisateurs` WHERE `ID` LIKE '" + idSource + "'"; String requete= "SELECT * FROM `Utilisateurs` WHERE `ID` LIKE '" + idSource + "'";
Statement stmt = null; Statement stmt = null;
ResultSet rs = null ; ResultSet rs = null ;
@ -334,34 +343,34 @@ public class DataBase {
try { try {
assert rs != null; assert rs != null;
if (rs.next()){ if (rs.next()){
Pseudo = rs.getString("Pseudo") ; pseudo = rs.getString("Pseudo") ;
} }
} catch (SQLException throwables) { } catch (SQLException throwables) {
throwables.printStackTrace(); throwables.printStackTrace();
} }
return Pseudo ; return pseudo ;
} }
/** /**
* Méthode permettant de récupérer les messages d'une plage de donnée [deb,fin] envoyés entre 2 utilisateurs * Méthode permettant de récupérer les messages d'une plage de donnée [deb,fin] envoyés entre 2 utilisateurs
* @param ID Utilisateur associé a ChatApp * @param iD Utilisateur associé a ChatApp
* @param IDdestinataire Celui avec qui correspond ID * @param iDdestinataire Celui avec qui correspond ID
* @param deb On veut les messages à partir de l'indice deb * @param deb On veut les messages à partir de l'indice deb
* @param fin On veut les messages jusqu'a l'indice fin * @param fin On veut les messages jusqu'a l'indice fin
* @return Les messages d'une plage de donnée [deb,fin] * @return Les messages d'une plage de donnée [deb,fin]
*/ */
public String recupMsg(String ID, String IDdestinataire, int deb , int fin) { public String recupMsg(String iD, String iDdestinataire, int deb , int fin) {
StringBuilder Msg = new StringBuilder(); StringBuilder msg = new StringBuilder();
String petit; String petit;
String grand; String grand;
int comparaison = ID.compareTo(IDdestinataire); int comparaison = iD.compareTo(iDdestinataire);
if (comparaison < 0) { if (comparaison < 0) {
petit = ID; petit = iD;
grand = IDdestinataire; grand = iDdestinataire;
} }
else { else {
petit = IDdestinataire; petit = iDdestinataire;
grand = ID ; grand = iD ;
} }
String nomTable = "Chat_" + petit + "_" + grand ; String nomTable = "Chat_" + petit + "_" + grand ;
String requete = "SELECT * FROM `"+ nomTable+"`"; String requete = "SELECT * FROM `"+ nomTable+"`";
@ -378,25 +387,25 @@ public class DataBase {
} catch (SQLException throwables) { } catch (SQLException throwables) {
throwables.printStackTrace(); throwables.printStackTrace();
} }
Integer Taille = tailleBDD(nomTable); Integer taille = tailleBDD(nomTable);
if(Taille < fin ){ if(taille < fin ){
fin = Taille ; fin = taille ;
} }
for(int i = 0 ; i < fin; i++){ for(int i = 0 ; i < fin; i++){
try { try {
assert rs != null; assert rs != null;
if( rs.next()){ if( rs.next()){
String IDSource = rs.getString("Source"); String iDSource = rs.getString("Source");
String Envoi = rs.getTimestamp("Envoi").toString(); String envoi = rs.getTimestamp("Envoi").toString();
String Message = rs.getString("Message"); String message = rs.getString("Message");
if (i >= deb) { if (i >= deb) {
if (IDSource.equals(ID)) { if (iDSource.equals(iD)) {
Msg.append("Moi (").append(Envoi).append(") : ").append(Message); msg.append("Moi (").append(envoi).append(") : ").append(message);
} else { } else {
String PseudoSource = getPseudo(IDSource); String PseudoSource = getPseudo(iDSource);
Msg.append(PseudoSource).append(" (").append(Envoi).append(") : ").append(Message); msg.append(PseudoSource).append(" (").append(envoi).append(") : ").append(message);
} }
Msg.append('\n'); msg.append('\n');
} }
} }
} catch (SQLException throwables) { } catch (SQLException throwables) {
@ -404,7 +413,7 @@ public class DataBase {
} }
} }
return Msg.toString(); return msg.toString();
} }
/** /**
@ -413,7 +422,7 @@ public class DataBase {
* @return Taille de la BDD * @return Taille de la BDD
*/ */
public Integer tailleBDD(String nomTable) { public Integer tailleBDD(String nomTable) {
Integer Taille = 0 ; Integer taille = 0 ;
String requete = "SELECT * FROM `"+nomTable+ "`"; String requete = "SELECT * FROM `"+nomTable+ "`";
Statement stmt = null; Statement stmt = null;
ResultSet rs = null ; ResultSet rs = null ;
@ -435,20 +444,20 @@ public class DataBase {
} catch (SQLException throwables) { } catch (SQLException throwables) {
throwables.printStackTrace(); throwables.printStackTrace();
} }
Taille++; // on incremente Taille pour chaque solution trouvée taille++; // on incremente Taille pour chaque solution trouvée
} }
return Taille; return taille;
} }
/** /**
* Methode permettant de savoir si un utilisateur existe dans la base de donnée 'Utilisateurs' * Methode permettant de savoir si un utilisateur existe dans la base de donnée 'Utilisateurs'
* @param ID On recherche l'utilisateur dont l'ID est ID * @param iD On recherche l'utilisateur dont l'ID est ID
* @return True si l'utilisateur existe , False sinon * @return True si l'utilisateur existe , False sinon
*/ */
public boolean idExiste(String ID){ public boolean idExiste(String iD){
boolean existe = false ; boolean existe = false ;
// Verification que l'utilisateur n'existe pas // Verification que l'utilisateur n'existe pas
String requete = "SELECT * FROM `Utilisateurs` WHERE `ID` LIKE '" + ID +"'"; String requete = "SELECT * FROM `Utilisateurs` WHERE `ID` LIKE '" + iD +"'";
Statement stmt; Statement stmt;
ResultSet rs = null ; ResultSet rs = null ;
try { try {
@ -469,22 +478,22 @@ public class DataBase {
/** /**
* Méthode permettant de récupérer le nom de la table sont stockés les messages de 2 utilisateurs. * Méthode permettant de récupérer le nom de la table sont stockés les messages de 2 utilisateurs.
* @param U1 Un des 2 utilisateurs * @param u1 Un des 2 utilisateurs
* @param U2 Le second utilisateur * @param u2 Le second utilisateur
* @return Le nom de la table des historiques * @return Le nom de la table des historiques
*/ */
public String getNomTable(Utilisateur U1, Utilisateur U2){ public String getNomTable(Utilisateur u1, Utilisateur u2){
String petit; String petit;
String grand; String grand;
int comparaison; int comparaison;
comparaison = U1.getId().compareTo(U2.getId()); comparaison = u1.getId().compareTo(u2.getId());
if (comparaison < 0) { if (comparaison < 0) {
petit = U1.getId(); petit = u1.getId();
grand = U2.getId(); grand = u2.getId();
} }
else { else {
petit = U2.getId() ; petit = u2.getId() ;
grand = U1.getId() ; grand = u1.getId() ;
} }
return "Chat_" + petit + "_" + grand ; return "Chat_" + petit + "_" + grand ;
} }

ファイルの表示

@ -1,8 +1,6 @@
package chatapp.Model; package chatapp.Model;
import chatapp.Controller.ChatApp;
import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.ArrayList; import java.util.ArrayList;
@ -13,7 +11,7 @@ import java.util.ArrayList;
*/ */
public class ListUtilisateurs { public class ListUtilisateurs {
// On conserve dans cette liste tout les utilisateurs actuellement actifs /* On conserve dans cette liste tout les utilisateurs actuellement actifs */
private ArrayList<Utilisateur> actifUsers ; private ArrayList<Utilisateur> actifUsers ;
/** /**
@ -30,7 +28,6 @@ public class ListUtilisateurs {
public synchronized void addList(Utilisateur u) { public synchronized void addList(Utilisateur u) {
if (! this.appartient(u)){ if (! this.appartient(u)){
this.actifUsers.add(u); this.actifUsers.add(u);
//ListeCommunicationPossible.add(u);
} }
} }
@ -53,7 +50,7 @@ public class ListUtilisateurs {
* Récupérer un utilisateur à partir de son addresse IP * Récupérer un utilisateur à partir de son addresse IP
* @param ip Adresse IP de l'utilisateur que l'on souhaite retrouver * @param ip Adresse IP de l'utilisateur que l'on souhaite retrouver
* @return L'utilisateur associé à l'adresse IP * @return L'utilisateur associé à l'adresse IP
* @throws Exception * @throws Exception No such user with this IP address
*/ */
public Utilisateur getIPList(InetAddress ip) throws Exception { public Utilisateur getIPList(InetAddress ip) throws Exception {
for(Utilisateur elem: this.actifUsers) for(Utilisateur elem: this.actifUsers)
@ -69,7 +66,7 @@ public class ListUtilisateurs {
* Récupérer un utilisateur à partir de son ID * Récupérer un utilisateur à partir de son ID
* @param iD L'ID de l'utilisateur que l'on souhaite retrouver * @param iD L'ID de l'utilisateur que l'on souhaite retrouver
* @return L'utilisateur associé à l'adresse ID * @return L'utilisateur associé à l'adresse ID
* @throws Exception * @throws Exception No such user with this ID
*/ */
public Utilisateur getIDList(String iD) throws Exception { public Utilisateur getIDList(String iD) throws Exception {
for(Utilisateur elem: this.actifUsers) for(Utilisateur elem: this.actifUsers)
@ -128,8 +125,9 @@ public class ListUtilisateurs {
boolean appartient = false ; boolean appartient = false ;
for(Utilisateur elem: this.actifUsers) for(Utilisateur elem: this.actifUsers)
{ {
if (elem.getId().equals(u.getId()) ) { if (elem.getId().equals(u.getId())) {
appartient = true ; appartient = true;
break;
} }
} }
System.out.println("Test appartient : " + appartient); System.out.println("Test appartient : " + appartient);

ファイルの表示

@ -16,10 +16,19 @@ import java.util.Date;
* </p> * </p>
*/ */
public class MessageHorodate implements Serializable { public class MessageHorodate implements Serializable {
/* Un message est toujours adressé à un destinataire */
private Utilisateur destinataire ; private Utilisateur destinataire ;
/* Un message est toujours associé à un utilisateur source */
private Utilisateur source ; private Utilisateur source ;
/* La date d'horodatage du message */
private Date dateHorodatage ; private Date dateHorodatage ;
private int type; // 0 = debut de la communication, 1= message de communication, 2 = fin de la communicataion
/* Le type d'un messge : 0 = debut de la communication, 1= message de communication, 2 = fin de la communicataion */
private int type;
/* Le corps du message */
private String Message; private String Message;
/** /**
@ -27,14 +36,14 @@ public class MessageHorodate implements Serializable {
* Constructeur , le message va etre horodaté * Constructeur , le message va etre horodaté
* @param destinataire - Destinataire du message * @param destinataire - Destinataire du message
* @param source - Source du message * @param source - Source du message
* @param Message - Message envoyé * @param message - Message envoyé
* @param type - Le type du message * @param type - Le type du message
* </p> * </p>
*/ */
public MessageHorodate(Utilisateur destinataire, Utilisateur source, String Message, int type) { public MessageHorodate(Utilisateur destinataire, Utilisateur source, String message, int type) {
this.setDestinataire(destinataire) ; this.setDestinataire(destinataire) ;
this.setSource(source) ; this.setSource(source) ;
this.setMessage(Message) ; this.setMessage(message) ;
this.setDateHorodatage(new Date()); this.setDateHorodatage(new Date());
this.type = type; this.type = type;
} }
@ -56,13 +65,13 @@ public class MessageHorodate implements Serializable {
*/ */
@Override @Override
public String toString() { public String toString() {
String Msg = ""; String msg = "";
Msg += ("Destinataire::" + this.getDestinataire() + "\n") ; msg += ("Destinataire::" + this.getDestinataire() + "\n") ;
Msg += ("Source::" + this.getSource()+ "\n") ; msg += ("Source::" + this.getSource()+ "\n") ;
Msg += ("Type::"+ this.type+ "\n"); msg += ("Type::"+ this.type+ "\n");
Msg += ("Date::" + this.dateToString() + "\n") ; msg += ("Date::" + this.dateToString() + "\n") ;
Msg += ("Message::" + this.getMessage() + "\n" ); msg += ("Message::" + this.getMessage() + "\n" );
return Msg ; return msg ;
} }
/** /**

ファイルの表示

@ -16,14 +16,23 @@ import java.net.UnknownHostException;
*/ */
public class Utilisateur { public class Utilisateur {
/* Un utilisateur possede un pseudo unique */
private String pseudo ; private String pseudo ;
/* Un port (utilisé lors de nos premiers tests pour tester le broadcast) */
private Integer port; private Integer port;
/* Un utilisateur est associé à une adresse IP */
private final InetAddress ip ; private final InetAddress ip ;
/* Chaque utilisateur possede un ID unique */
private final String id ; private final String id ;
/* La taille maximum d'un ID */
Integer TAILLE_MAX = 5; Integer TAILLE_MAX = 5;
/** /**
* Constructeur : Utilisateur * Constructeur : Utilisateur (3 paramètres)
* @param pseudo Le pseudo associé * @param pseudo Le pseudo associé
* @param port Le port * @param port Le port
* @param ip L'adresse IP * @param ip L'adresse IP
@ -39,7 +48,7 @@ public class Utilisateur {
} }
/** /**
* Constructeur : Utilisateur * Constructeur : Utilisateur (4 paramètres)
* @param pseudo Le pseudo associé * @param pseudo Le pseudo associé
* @param port Le port * @param port Le port
* @param ip L'adresse IP * @param ip L'adresse IP

ファイルの表示

@ -17,8 +17,13 @@ import java.util.HashMap;
*/ */
public class HttpEchange { public class HttpEchange {
private String url = "http://192.168.1.72:8080/JavaEEHelloWorld_war_exploded/"; //Correspond à l'url de notre serveur de presence /* URL de notre serveur de presence */
private static boolean connecte = false; // True si l'utilisateur peut se connecter avec ce nom d'utilisateur , False sinon private String url = "http://192.168.1.72:8080/JavaEEHelloWorld_war_exploded/";
/* True si l'utilisateur peut se connecter avec ce nom d'utilisateur , False sinon */
private static boolean connecte = false;
/* Une instance de chatapp */
private ChatApp chatapp; private ChatApp chatapp;
/** /**
@ -140,7 +145,6 @@ public class HttpEchange {
} }
/** /**
* Getter : Connecte * Getter : Connecte
* @return Le boolean connecté (True s'il peut se connecter avec ce nom d'utilisateur , False sinon) * @return Le boolean connecté (True s'il peut se connecter avec ce nom d'utilisateur , False sinon)

ファイルの表示

@ -15,10 +15,13 @@ import java.util.ArrayList;
* </p> * </p>
*/ */
public class RunnerEcouteTCP extends Thread { public class RunnerEcouteTCP extends Thread {
/* Une instance de ChaAapp */
public ChatApp app ; public ChatApp app ;
private PropertyChangeSupport pcs; private PropertyChangeSupport pcs;
// on conserve les sessions actives dans un attribut liste
private ArrayList<SessionClavardage> ListeSessions = new ArrayList<>(); /* on conserve les sessions actives dans un attribut liste */
private ArrayList<SessionClavardage> listeSessions = new ArrayList<>();
/** /**
* Constructeur * Constructeur
@ -54,7 +57,7 @@ public class RunnerEcouteTCP extends Thread {
System.out.println("Attente Session de clavardage"); System.out.println("Attente Session de clavardage");
Socket link = ss.accept(); // Blocante Socket link = ss.accept(); // Blocante
SessionClavardage session = new SessionClavardage(link,app); SessionClavardage session = new SessionClavardage(link,app);
this.ListeSessions.add(session); this.listeSessions.add(session);
pcs.firePropertyChange("NouvelleSession",false,true); pcs.firePropertyChange("NouvelleSession",false,true);
} }
} }
@ -68,7 +71,7 @@ public class RunnerEcouteTCP extends Thread {
* @param session Session Active que l'on souhaite rajouter * @param session Session Active que l'on souhaite rajouter
*/ */
public void addSession(SessionClavardage session){ public void addSession(SessionClavardage session){
this.ListeSessions.add(session); this.listeSessions.add(session);
pcs.firePropertyChange("NouvelleSession",false,true); pcs.firePropertyChange("NouvelleSession",false,true);
} }
@ -77,7 +80,7 @@ public class RunnerEcouteTCP extends Thread {
* @return Premiere Session Active * @return Premiere Session Active
*/ */
public SessionClavardage getSessionClavardage() { public SessionClavardage getSessionClavardage() {
return(this.ListeSessions.remove(0)); return(this.listeSessions.remove(0));
} }
/** /**

ファイルの表示

@ -20,7 +20,7 @@ public class RunnerEcouteUDP extends Thread {
/** /**
* Méthode qui vient ecraser la méthode run de la classe Thread. * Méthode qui vient ecraser la méthode run de la classe Thread.
* La méthode 'ecouteUDP' est appelé. * <br> La méthode 'ecouteUDP' est appelé.
*/ */
@Override @Override
public void run() { public void run() {

ファイルの表示

@ -1,28 +1,26 @@
package chatapp.Protocol; package chatapp.Protocol;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import chatapp.Controller.ChatApp; import chatapp.Controller.ChatApp;
import chatapp.Model.DataBase;
import chatapp.Model.MessageHorodate; import chatapp.Model.MessageHorodate;
import chatapp.Model.Utilisateur; import chatapp.Model.Utilisateur;
import chatapp.View.FenetreSession; import chatapp.View.FenetreSession;
import javafx.application.Platform; import javafx.application.Platform;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
/** /**
* <p> * <p>
* Classe représentant une session de clavardage. * Classe représentant une session de clavardage.
* <br> La classe hérite de la classe Thread et dispose de 2 constructeurs selon que l'on initie une demande de session ou que l'on recoit une demande. * <br> La classe hérite de la classe Thread et dispose de 2 constructeurs selon que l'on initie une demande de session ou que l'on recoit une demande.
* <br> Elle possède en attribut: * <br> Elle possède en attribut:
* <br> - link: la socket associée à la session de clavardage * <br> - link : la socket associée à la session de clavardage
* <br> - app : L'instance de chatapp
* <br> - u2: l'utilisateur avec lequel on communique * <br> - u2: l'utilisateur avec lequel on communique
* <br> - out: le flux de donnees sortant * <br> - out: le flux de donnees sortant
* <br> - in: le flux de donnees entrant * <br> - in: le flux de donnees entrant
@ -31,14 +29,27 @@ import javafx.application.Platform;
* </p> * </p>
*/ */
public class SessionClavardage extends Thread { public class SessionClavardage extends Thread {
/* la socket associée à la session de clavardage */
private Socket link; private Socket link;
/* L'instance de chatapp */
private ChatApp app; private ChatApp app;
/* l'utilisateur avec lequel on communique */
private Utilisateur u2; private Utilisateur u2;
/* le flux de donnees sortant */
private ObjectOutputStream out; private ObjectOutputStream out;
/* le flux de donnees entrant */
private ObjectInputStream in; private ObjectInputStream in;
/* Le PropertyChangeSupport permettant d'envoyer les notifications de MessageRecu et de FindeSession */
private PropertyChangeSupport pcs; private PropertyChangeSupport pcs;
private ArrayList<MessageHorodate> derniersMsg; // on met temporairement les derniers msgs pour éviter les pb de synchro inter-threads
private int SessionID; /* On met temporairement les derniers msgs pour éviter les pb de synchro inter-threads */
private ArrayList<MessageHorodate> derniersMsg;
/** /**
* <p> Ce constructeur crée une session de clavardage quand on recoit une requete</p> * <p> Ce constructeur crée une session de clavardage quand on recoit une requete</p>
@ -54,8 +65,7 @@ public class SessionClavardage extends Thread {
}catch(Exception e) { }catch(Exception e) {
e.getStackTrace(); e.getStackTrace();
} }
this.derniersMsg = new ArrayList<MessageHorodate>(); this.derniersMsg = new ArrayList<>();
this.SessionID = 2;
this.pcs = new PropertyChangeSupport(this); this.pcs = new PropertyChangeSupport(this);
this.start(); this.start();
} }
@ -77,7 +87,7 @@ public class SessionClavardage extends Thread {
e.printStackTrace(); e.printStackTrace();
} }
this.derniersMsg = new ArrayList<MessageHorodate>(); this.derniersMsg = new ArrayList<>();
this.pcs = new PropertyChangeSupport(this); this.pcs = new PropertyChangeSupport(this);
this.start(); this.start();
this.initierSession(); this.initierSession();
@ -103,13 +113,13 @@ public class SessionClavardage extends Thread {
try { try {
getOut().writeObject(msgh.toString()); getOut().writeObject(msgh.toString());
} catch (IOException e) { } catch (IOException e) {
//e.printStackTrace(); e.printStackTrace();
} }
finally { finally {
try { try {
link.close(); link.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
} }
} }
} }
@ -123,15 +133,16 @@ public class SessionClavardage extends Thread {
isExterne="true"; // on indiquera dans le message si l'on est externe ou interne isExterne="true"; // on indiquera dans le message si l'on est externe ou interne
} }
System.out.println("Ajout d'un utilisateur dans communication"); System.out.println("Ajout d'un utilisateur dans communication");
app.ListeCommunication.add(getU2().getId()); app.listeCommunication.add(getU2().getId());
System.out.println(app.ListeCommunication.size()); System.out.println(app.listeCommunication.size());
MessageHorodate msgh = new MessageHorodate(getU2(),getApp().getMe(),isExterne,3); MessageHorodate msgh = new MessageHorodate(getU2(),getApp().getMe(),isExterne,3);
try { try {
getOut().writeObject(msgh.toString()); getOut().writeObject(msgh.toString());
} catch (IOException e) { } catch (IOException e) {
//e.printStackTrace(); e.printStackTrace();
} }
} }
/** /**
* Methode transformant prenant un string pour le transmettre sous la forme d'un message horodate a l'utilisateur distant * Methode transformant prenant un string pour le transmettre sous la forme d'un message horodate a l'utilisateur distant
* @param msg Le texte du message à envoyer * @param msg Le texte du message à envoyer
@ -161,10 +172,10 @@ public class SessionClavardage extends Thread {
* <p> Methode lancee par le thread, permet de receptionner les messages horodates recus et d'agir en conséquence selon le type de message recu</p> * <p> Methode lancee par le thread, permet de receptionner les messages horodates recus et d'agir en conséquence selon le type de message recu</p>
*/ */
public void run() { public void run() {
String plaintext = null; String plaintext;
MessageHorodate msg = null; MessageHorodate msg = null;
System.out.println("Session demarre"); System.out.println("Session demarre");
//app.getDb().CreationTableHistorique(app.getMe().getId(), u2.getId()); //app.getDb().creationTableHistorique(app.getMe().getId(), u2.getId());
while(true) { while(true) {
try { try {
plaintext = (String) getIn().readObject(); plaintext = (String) getIn().readObject();
@ -175,7 +186,7 @@ public class SessionClavardage extends Thread {
e.printStackTrace(); e.printStackTrace();
} catch (IOException e) { } catch (IOException e) {
pcs.firePropertyChange("FinDeLaSession", false, true); pcs.firePropertyChange("FinDeLaSession", false, true);
app.ListeCommunication.remove(u2.getId()); app.listeCommunication.remove(u2.getId());
break; break;
} }
if(msg.getType() == 2) { if(msg.getType() == 2) {
@ -185,13 +196,13 @@ public class SessionClavardage extends Thread {
} catch (IOException e) { } catch (IOException e) {
break; break;
} }
app.ListeCommunication.remove(u2.getId()); app.listeCommunication.remove(u2.getId());
break; break;
} }
else if(msg.getType() == 3) { else if(msg.getType() == 3) {
System.out.println("Session Initiee"); System.out.println("Session Initiee");
this.u2 = msg.getSource() ; this.u2 = msg.getSource() ;
app.ListeCommunication.add(u2.getId()); app.listeCommunication.add(u2.getId());
Platform.runLater( () -> Platform.runLater( () ->
new FenetreSession(this) new FenetreSession(this)
); );
@ -199,7 +210,6 @@ public class SessionClavardage extends Thread {
else{ else{
derniersMsg.add(msg); derniersMsg.add(msg);
pcs.firePropertyChange("MessageRecu",false,true);} pcs.firePropertyChange("MessageRecu",false,true);}
} }
} }
@ -275,12 +285,4 @@ public class SessionClavardage extends Thread {
this.u2 = u2; this.u2 = u2;
} }
/**
* Getter : SessionID
* @return SessionID
*/
public int getSessionID() {
return SessionID;
}
} }

ファイルの表示

@ -24,10 +24,8 @@ import chatapp.Model.*;
*/ */
public class UDPEchange { public class UDPEchange {
/* True si l'utilisateur peut se connecter avec ce nom d'utilisateur , False sinon */
private static Boolean Connecte = true; private static Boolean Connecte = true;
// True si l'utilisateur peut se connecter avec ce nom d'utilisateur , False sinon
private static Boolean EcouteEnCours = false;
/** /**
* Getter : Connecte * Getter : Connecte
@ -64,7 +62,6 @@ public class UDPEchange {
PseudoValide = value ; PseudoValide = value ;
} }
/**<p> /**<p>
* Getter : Ip * Getter : Ip
* <br>Permet de recuperer l'adresse de l'hote sur le reseau au format IPv4. * <br>Permet de recuperer l'adresse de l'hote sur le reseau au format IPv4.
@ -94,6 +91,7 @@ public class UDPEchange {
} }
return null; return null;
} }
/** /**
* <p> * <p>
* Méthode permettant d'envoyer un message à tout les utilisateurs à l'aide du protocole UDP * Méthode permettant d'envoyer un message à tout les utilisateurs à l'aide du protocole UDP
@ -101,9 +99,9 @@ public class UDPEchange {
* @param broadcastMessage Message à transmettre aux utilisateurs * @param broadcastMessage Message à transmettre aux utilisateurs
* @throws IOException * @throws IOException
*/ */
public static void EnvoiBroadcast(String broadcastMessage) throws IOException { public static void envoiBroadcast(String broadcastMessage) throws IOException {
int port = 1234 ; int port = 1234 ;
// Envoie en broadcast à tous les utilsateurs // Envoie en broadcast à tous les utilisateurs
for (InetAddress broadcastAddr : listAllBroadcastAddresses()) { for (InetAddress broadcastAddr : listAllBroadcastAddresses()) {
DatagramSocket socket = new DatagramSocket(); DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true); socket.setBroadcast(true);
@ -127,8 +125,7 @@ public class UDPEchange {
* </p> * </p>
* @param app L'application de chat de l'utilisateur qui receptionne le message * @param app L'application de chat de l'utilisateur qui receptionne le message
*/ */
public static void ecouteUDP(ChatApp app) public static void ecouteUDP(ChatApp app) {
{
DatagramSocket socket = null; DatagramSocket socket = null;
ExecutorService exec = Executors.newFixedThreadPool(1000); ExecutorService exec = Executors.newFixedThreadPool(1000);
try { try {
@ -157,22 +154,22 @@ public class UDPEchange {
* Méthode permettant d'envoyer un message a utilisateur en particulier * Méthode permettant d'envoyer un message a utilisateur en particulier
* a l'aide du protocole UDP * a l'aide du protocole UDP
* </p> * </p>
* @param Adress L'adresse IP de l'utilisateur * @param address L'adresse IP de l'utilisateur
* @param Message Message message à transmettre a l'utilisateur * @param message Message message à transmettre a l'utilisateur
* @throws IOException * @throws IOException
*/ */
public static void envoiUnicast( InetAddress Adress , String Message ) throws IOException { public static void envoiUnicast( InetAddress address , String message ) throws IOException {
if (ChatApp.getInstance().isConnecte()){ if (ChatApp.getInstance().isConnecte()){
DatagramSocket socket = new DatagramSocket(); DatagramSocket socket = new DatagramSocket();
byte[]buffer = Message.getBytes(); byte[]buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length, Adress, 1234 ); DatagramPacket packet = new DatagramPacket( buffer, buffer.length, address, 1234 );
socket.send(packet); socket.send(packet);
socket.close(); socket.close();
System.out.println("***********Message envoye***********"); System.out.println("***********Message envoye***********");
System.out.println("Dest Ip: " + Adress.toString()); System.out.println("Dest Ip: " + address.toString());
System.out.println("Dest port: " + String.valueOf(1234)); System.out.println("Dest port: " + String.valueOf(1234));
System.out.println("Contenu: "); System.out.println("Contenu: ");
System.out.println(Message); System.out.println(message);
System.out.println("************************************"); System.out.println("************************************");
} }
} }
@ -215,6 +212,11 @@ class RunnerUDP implements Runnable {
final DatagramPacket data ; final DatagramPacket data ;
ChatApp app ; ChatApp app ;
/**
* Constructeur RunnerUDP
* @param data Un datagramPacket
* @param app Instance de chatapp
*/
public RunnerUDP(DatagramPacket data, ChatApp app) { public RunnerUDP(DatagramPacket data, ChatApp app) {
this.data= data; this.data= data;
this.app = app ; this.app = app ;
@ -310,19 +312,19 @@ class RunnerUDP implements Runnable {
//******************************************************************************************************************* //*******************************************************************************************************************
if (Type.equals("Demande Modification Pseudo")) { if (Type.equals("Demande Modification Pseudo")) {
Utilisateur Source = Utilisateur.stringToUtilisateur(received.split("\n")[1]); Utilisateur source = Utilisateur.stringToUtilisateur(received.split("\n")[1]);
if (! Source.equals(this.app.getMe())) { // On envoit en broadcast mais on ne souhaite pas recevoir de message de nous même if (! source.equals(this.app.getMe())) { // On envoit en broadcast mais on ne souhaite pas recevoir de message de nous même
String nouveau = received.split("\n")[2] ; String nouveau = received.split("\n")[2] ;
String Message = ""; String message = "";
if(( app.getActifUsers() ).verifierUnicite(nouveau)) { if(( app.getActifUsers() ).verifierUnicite(nouveau)) {
Message = "Bon Choix Pseudo\n" + nouveau ; message = "Bon Choix Pseudo\n" + nouveau ;
} }
else { else {
Message = "Mauvais Choix Pseudo\n" ; message = "Mauvais Choix Pseudo\n" ;
} }
System.out.println(Message); System.out.println(message);
try { try {
UDPEchange.envoiUnicast(Source.getIp(),Message); UDPEchange.envoiUnicast(source.getIp(),message);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -335,18 +337,18 @@ class RunnerUDP implements Runnable {
//************************************************************************************************************ //************************************************************************************************************
if (Type.equals("Modification pseudo reussi")) { if (Type.equals("Modification pseudo reussi")) {
Utilisateur Source = Utilisateur.stringToUtilisateur(received.split("\n")[1]); Utilisateur source = Utilisateur.stringToUtilisateur(received.split("\n")[1]);
if (! Source.equals(this.app.getMe())) { // On envoit en broadcast mais on ne souhaite pas recevoir de message de nous même if (! source.equals(this.app.getMe())) { // On envoit en broadcast mais on ne souhaite pas recevoir de message de nous même
String nouveau = received.split("\n")[2] ; String nouveau = received.split("\n")[2] ;
System.out.println("Je rentre ici"); System.out.println("Je rentre ici");
if(app.getActifUsers().appartient(Source)) { // On verifie d'abord que Source appartient bien a la liste des utilisateurs actifs if(app.getActifUsers().appartient(source)) { // On verifie d'abord que Source appartient bien a la liste des utilisateurs actifs
System.out.println(Source.getPseudo() + " va etre changer en : " + nouveau); System.out.println(source.getPseudo() + " va etre changer en : " + nouveau);
app.getActifUsers().modifierList(Source.getPseudo(), nouveau); app.getActifUsers().modifierList(source.getPseudo(), nouveau);
} else { } else {
System.out.println(Source.getPseudo() + " va etre ajouter en : " + nouveau); System.out.println(source.getPseudo() + " va etre ajouter en : " + nouveau);
// Suite a une perte d'un message lors d'une connexion l'utilisateur Source n'apparait pas dans la liste // Suite a une perte d'un message lors d'une connexion l'utilisateur Source n'apparait pas dans la liste
Source.setPseudo(nouveau); source.setPseudo(nouveau);
app.getActifUsers().addList(Source); app.getActifUsers().addList(source);
} }
} }
} }
@ -390,8 +392,4 @@ class RunnerUDP implements Runnable {
app.getActifUsers().addList(nouveau); app.getActifUsers().addList(nouveau);
} }
} }
} }

ファイルの表示

@ -41,12 +41,8 @@ public class ChangementPseudo {
@FXML // fx:id="MenuButton" @FXML // fx:id="MenuButton"
private Button MenuButton; // Value injected by FXMLLoader private Button MenuButton; // Value injected by FXMLLoader
/* Une instance de chatApp */
private ChatApp chatApp; private ChatApp chatApp;
@FXML
void nouveauPseudo(ActionEvent event) {
}
@FXML @FXML
/** /**
@ -100,6 +96,5 @@ public class ChangementPseudo {
chatApp = ChatApp.getInstance(); chatApp = ChatApp.getInstance();
pseudonyme1.setText(chatApp.getMe().getPseudo()); pseudonyme1.setText(chatApp.getMe().getPseudo());
this.validationButton.setDefaultButton(true); this.validationButton.setDefaultButton(true);
//System.out.println(this.validationButton.isDefaultButton());
} }
} }

ファイルの表示

@ -9,7 +9,6 @@ import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import chatapp.Controller.ChatApp;
import chatapp.Model.MessageHorodate; import chatapp.Model.MessageHorodate;
import chatapp.Model.Utilisateur; import chatapp.Model.Utilisateur;
import chatapp.Protocol.SessionClavardage; import chatapp.Protocol.SessionClavardage;
@ -52,9 +51,15 @@ public class Clavardage implements Initializable, PropertyChangeListener {
@FXML // fx:id="MenuButton" @FXML // fx:id="MenuButton"
/* L'utilisateur destinataire */
private Utilisateur u2; private Utilisateur u2;
/* Une session de clavardage */
private SessionClavardage session; private SessionClavardage session;
/* Le nom de la table dans la BDD stockant l'historique des messages */
private String nomTable; private String nomTable;
@FXML @FXML
/** /**
* <p>Handler gerant l'envoi du message contenu dans le TextField AEnvoyer et sur pression du bouton EnvoyerButton</p> * <p>Handler gerant l'envoi du message contenu dans le TextField AEnvoyer et sur pression du bouton EnvoyerButton</p>

ファイルの表示

@ -24,10 +24,16 @@ import javafx.stage.Stage;
*/ */
public class ConnexionScreen { public class ConnexionScreen {
/* Bouton de connexion */
public Button connexionButton; public Button connexionButton;
/* Zone de texte où inserer le pseudonyme souhaité */
public TextField pseudonyme; public TextField pseudonyme;
/* RadioButton : l'utilisateur est distant */
public RadioButton remoteButton; public RadioButton remoteButton;
/* RadioButton : l'utilisateur est local */
public RadioButton localButton; public RadioButton localButton;
@FXML // ResourceBundle that was given to the FXMLLoader @FXML // ResourceBundle that was given to the FXMLLoader
@ -38,8 +44,7 @@ public class ConnexionScreen {
@FXML // This method is called by the FXMLLoader when initialization is complete @FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() { void initialize() {
connexionButton.setDefaultButton(true); connexionButton.setDefaultButton(true); // Appuyer sur entrée equivaut a cliquer sur le bouton de connexion
} }
/** /**

ファイルの表示

@ -39,6 +39,8 @@ public class DemarrerSession {
@FXML // fx:id="MenuButton" @FXML // fx:id="MenuButton"
private Button MenuButton; // Value injected by FXMLLoader private Button MenuButton; // Value injected by FXMLLoader
/* Instance de chatApp */
private ChatApp chatApp; private ChatApp chatApp;
/** /**

ファイルの表示

@ -1,22 +1,18 @@
package chatapp.View; package chatapp.View;
import chatapp.Protocol.SessionClavardage; import chatapp.Protocol.SessionClavardage;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Parent; import javafx.scene.Parent;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
/** /**
* <p> * <p>
* Classe permettant d'ouvrir une nouvelle fenetre afin de clavarder avec un utilisateur. * Classe permettant d'ouvrir une nouvelle fenetre afin de clavarder avec un utilisateur.
* </p> * </p>
*/ */
public class FenetreSession extends Stage { public class FenetreSession extends Stage {
SessionClavardage session;
/** /**
* <p> Permet l'ouverture de la fenetre associee a la session de clavardage</p> * <p> Permet l'ouverture de la fenetre associee a la session de clavardage</p>
* @param session Un objet FenetreSession est attribué avec un objet de type SessionClavardage * @param session Un objet FenetreSession est attribué avec un objet de type SessionClavardage
@ -26,24 +22,16 @@ public class FenetreSession extends Stage {
try{ try{
Parent rootchat = fichier.load(); Parent rootchat = fichier.load();
Clavardage controller = fichier.getController(); Clavardage controller = fichier.getController();
System.out.println("Session id "+session.getSessionID());
//controller.printsalut();
controller.setSession(session); controller.setSession(session);
Scene scene1 = null; Scene scene1;
scene1 = new Scene(rootchat,600,400); scene1 = new Scene(rootchat,600,400);
this.setScene(scene1); this.setScene(scene1);
this.setTitle("Session avec "+session.getU2().getPseudo()); this.setTitle("Session avec "+session.getU2().getPseudo());
this.setMinWidth(600); this.setMinWidth(600);
this.setMinHeight(400); this.setMinHeight(400);
//this.setMaxWidth(600);
//this.setMaxHeight(400);
this.show(); this.show();
this.centerOnScreen(); this.centerOnScreen();
this.setOnCloseRequest(new EventHandler<WindowEvent>() { this.setOnCloseRequest(we -> session.arretSession());
public void handle(WindowEvent we) {
session.arretSession();
}
});
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

ファイルの表示

@ -1,12 +1,7 @@
package chatapp.View; package chatapp.View;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import chatapp.Controller.ChatApp; import chatapp.Controller.ChatApp;
import javafx.application.Platform;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
@ -15,6 +10,11 @@ import javafx.scene.Scene;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import javafx.scene.text.Text; import javafx.scene.text.Text;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
/** /**
* <p> * <p>
* Classe representant la page d'accueil. Elle est composé d'un menu en haut a gauche. * Classe representant la page d'accueil. Elle est composé d'un menu en haut a gauche.
@ -23,13 +23,24 @@ import javafx.stage.Stage;
*/ */
public class View_Menu { public class View_Menu {
/* Le pseudo de l'utilisateur */
public Text pseudonyme; public Text pseudonyme;
/* Choix dans la bar de menu : Connaitre les utilisateurs actifs */
public MenuItem utilsActifsButton; public MenuItem utilsActifsButton;
/* Choix dans la bar de menu : Demarrer une session de clavardage */
public MenuItem demarrerSessionButton; public MenuItem demarrerSessionButton;
/* Choix dans la bar de menu : Changer de pseudo */
public MenuItem changerPseudoButton; public MenuItem changerPseudoButton;
@FXML // ResourceBundle that was given to the FXMLLoader @FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources; private ResourceBundle resources;
/* Une instance de chatApp */
private ChatApp chatapp; private ChatApp chatapp;
@FXML // URL location of the FXML file that was given to the FXMLLoader @FXML // URL location of the FXML file that was given to the FXMLLoader
private URL location; private URL location;
@ -97,9 +108,6 @@ public class View_Menu {
public void deconnexion(ActionEvent actionEvent) { public void deconnexion(ActionEvent actionEvent) {
try { try {
chatapp.deconnexion(); chatapp.deconnexion();
/*chatapp.getMain().stop();
Platform.exit();
System.exit(0);*/
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} catch (Exception e) { } catch (Exception e) {

ファイルの表示

@ -22,8 +22,12 @@ import javafx.stage.Stage;
*/ */
public class View_Utilisateurs { public class View_Utilisateurs {
/* La zone d'affichage des utilisateurs actifs */
public TextArea ListeUtilisateurs; public TextArea ListeUtilisateurs;
/* Bouton de retour au menu */
public Button MenuButton; public Button MenuButton;
@FXML // ResourceBundle that was given to the FXMLLoader @FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources; private ResourceBundle resources;
@ -38,8 +42,6 @@ public class View_Utilisateurs {
ListeUtilisateurs.appendText( " - " +elem.getPseudo() + '\n'); ListeUtilisateurs.appendText( " - " +elem.getPseudo() + '\n');
} }
ListeUtilisateurs.setEditable(false); ListeUtilisateurs.setEditable(false);
} }
/** /**