Nouvelle interface graphique
This commit is contained in:
förälder
8794238d89
incheckning
c4eccf38a9
8 ändrade filer med 269 tillägg och 447 borttagningar
|
@ -2,6 +2,10 @@
|
||||||
<module external.linked.project.id="chatapp" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.example" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
|
<module external.linked.project.id="chatapp" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.example" external.system.module.version="1.0-SNAPSHOT" type="JAVA_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$/../..">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/../../.gradle" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/../../build" />
|
||||||
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
|
|
6
Implementation/chatapp/.idea/vcs.xml
Normal file
6
Implementation/chatapp/.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -1,13 +1,15 @@
|
||||||
|
chatapp/Launcher.java
|
||||||
|
chatapp.Launcher
|
||||||
chatapp/Model/ListUtilisateurs.java
|
chatapp/Model/ListUtilisateurs.java
|
||||||
chatapp.Model.ListUtilisateurs
|
chatapp.Model.ListUtilisateurs
|
||||||
chatapp/Model/MessageHorodate.java
|
|
||||||
chatapp.Model.MessageHorodate
|
|
||||||
chatapp/Model/Utilisateur.java
|
chatapp/Model/Utilisateur.java
|
||||||
chatapp.Model.Utilisateur
|
chatapp.Model.Utilisateur
|
||||||
chatapp/Model/Historique.java
|
chatapp/Model/Historique.java
|
||||||
chatapp.Model.Historique
|
chatapp.Model.Historique
|
||||||
chatapp/Launcher.java
|
chatapp/Model/MessageHorodate.java
|
||||||
chatapp.Launcher
|
chatapp.Model.MessageHorodate
|
||||||
|
chatapp/Model/DataBase.java
|
||||||
|
chatapp.Model.DataBase
|
||||||
chatapp/Protocol/RunnerEcouteTCP.java
|
chatapp/Protocol/RunnerEcouteTCP.java
|
||||||
chatapp.Protocol.RunnerEcouteTCP
|
chatapp.Protocol.RunnerEcouteTCP
|
||||||
chatapp/View/FenetreSession.java
|
chatapp/View/FenetreSession.java
|
||||||
|
@ -30,6 +32,7 @@ chatapp/Main.java
|
||||||
chatapp.Main
|
chatapp.Main
|
||||||
chatapp/View/Clavardage.java
|
chatapp/View/Clavardage.java
|
||||||
chatapp.View.Clavardage
|
chatapp.View.Clavardage
|
||||||
|
chatapp.View.Clavardage$1
|
||||||
chatapp/Protocol/SessionClavardage.java
|
chatapp/Protocol/SessionClavardage.java
|
||||||
chatapp.Protocol.SessionClavardage
|
chatapp.Protocol.SessionClavardage
|
||||||
chatapp/View/ConnexionScreen.java
|
chatapp/View/ConnexionScreen.java
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
package chatapp.Controller;
|
package chatapp.Controller;
|
||||||
|
|
||||||
import chatapp.Model.Historique;
|
import chatapp.Model.*;
|
||||||
import chatapp.Model.ListUtilisateurs;
|
|
||||||
import chatapp.Model.MessageHorodate;
|
|
||||||
import chatapp.Model.Utilisateur;
|
|
||||||
import chatapp.Protocol.*;
|
import chatapp.Protocol.*;
|
||||||
import javafx.application.Application;
|
import javafx.application.Application;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
|
@ -22,9 +19,7 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
/* Liste des utilisateurs actifs */
|
/* Liste des utilisateurs actifs */
|
||||||
private ListUtilisateurs actifUsers ;
|
private ListUtilisateurs actifUsers ;
|
||||||
|
|
||||||
/* Map on l'on stocke localement les historiques des messages */
|
|
||||||
private Map<String, Historique> mapHistorique ;
|
|
||||||
private boolean historiqueAvailable = true;
|
|
||||||
|
|
||||||
/* ChatApp est associe a un utilisateur */
|
/* ChatApp est associe a un utilisateur */
|
||||||
private Utilisateur me;
|
private Utilisateur me;
|
||||||
|
@ -36,7 +31,7 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
private static ChatApp chatapp = null;
|
private static ChatApp chatapp = null;
|
||||||
private RunnerEcouteTCP runnerEcouteTCP;
|
private RunnerEcouteTCP runnerEcouteTCP;
|
||||||
private RunnerEcouteUDP runnerEcouteUDP;
|
private RunnerEcouteUDP runnerEcouteUDP;
|
||||||
|
private DataBase db;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructeur de l'application de chat
|
* Constructeur de l'application de chat
|
||||||
|
@ -51,8 +46,9 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
ip = UDPEchange.getCurrentIp();
|
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.mapHistorique = new HashMap<String,Historique>() ;
|
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
//this.db= DataBase.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized ChatApp getInstance(String pseudo, Integer port, Application main){
|
public static synchronized ChatApp getInstance(String pseudo, Integer port, Application main){
|
||||||
|
@ -66,14 +62,7 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
return chatapp;
|
return chatapp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Mettre a jour dans Maphistorique, l'historique avec un utilisateur dont le nom est pseudo
|
|
||||||
*
|
|
||||||
* @param h nouvel Historique entre les deux utilisateurs
|
|
||||||
*/
|
|
||||||
public synchronized void majHistorique(Historique h) {
|
|
||||||
getMapHistorique().put(h.getUser2().getPseudo(),h);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*public void majHistorique2(MessageHorodate mh, String pseudo) {
|
/*public void majHistorique2(MessageHorodate mh, String pseudo) {
|
||||||
Historique h = getMapHistorique().get(pseudo);
|
Historique h = getMapHistorique().get(pseudo);
|
||||||
|
@ -81,18 +70,6 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
getMapHistorique().put(h.getUser2().getPseudo(),h);
|
getMapHistorique().put(h.getUser2().getPseudo(),h);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
public void majHistorique2(String mh, String pseudo) {
|
|
||||||
Historique h = getMapHistorique().get(pseudo);
|
|
||||||
MessageHorodate msghor = new MessageHorodate(this.getMe(),this.getMe(),"rien",1);
|
|
||||||
System.out.println(">>"+mh+"<<");
|
|
||||||
System.out.print(msghor.getDateHorodatage());
|
|
||||||
System.out.println(msghor.getDestinataire());
|
|
||||||
System.out.println(msghor.getSource());
|
|
||||||
System.out.println(msghor.getType());
|
|
||||||
|
|
||||||
h.addMessage(msghor);
|
|
||||||
getMapHistorique().put(h.getUser2().getPseudo(),h);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modification du pseudo de l'utilisateur
|
* Modification du pseudo de l'utilisateur
|
||||||
|
@ -230,29 +207,8 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
return actifUsers;
|
return actifUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter
|
|
||||||
* @return la map des historiques
|
|
||||||
*/
|
|
||||||
public Map<String,Historique> getMapHistorique() {
|
|
||||||
return mapHistorique;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtenir l'historique entre deux utilisateurs
|
|
||||||
* @param pseudo Pseudo de l'utilisateur dont on souhaite obtenir l'historique
|
|
||||||
* @return Un historique
|
|
||||||
*/
|
|
||||||
public synchronized Historique getHist(String pseudo) {
|
|
||||||
Historique h = this.mapHistorique.get(pseudo);
|
|
||||||
if( h != null) {
|
|
||||||
return h ;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
h = new Historique(this.me, this.getActifUsers().getPseudoList(pseudo));
|
|
||||||
return h ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*public static void main (String[] args) throws IOException {
|
/*public static void main (String[] args) throws IOException {
|
||||||
ChatApp app = new ChatApp(args[0],Integer.parseInt(args[1]),this.app) ;
|
ChatApp app = new ChatApp(args[0],Integer.parseInt(args[1]),this.app) ;
|
||||||
|
@ -285,13 +241,6 @@ public class ChatApp implements PropertyChangeListener {
|
||||||
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
public boolean isHistoriqueAvailable() {
|
|
||||||
return historiqueAvailable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHistoriqueAvailable(boolean historiqueAvailable) {
|
|
||||||
this.historiqueAvailable = historiqueAvailable;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void propertyChange(PropertyChangeEvent evt) {
|
public void propertyChange(PropertyChangeEvent evt) {
|
||||||
|
|
234
Implementation/chatapp/src/main/java/chatapp/Model/DataBase.java
Normal file
234
Implementation/chatapp/src/main/java/chatapp/Model/DataBase.java
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
package chatapp.Model;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
|
||||||
|
public class DataBase {
|
||||||
|
private String DBurl = "jdbc:mysql://srv-bdens.insa-toulouse.fr:3306" ;
|
||||||
|
private Connection connection = null;
|
||||||
|
private String login = "tp_servlet_006";
|
||||||
|
private String pswd = "baePh9ei";
|
||||||
|
|
||||||
|
|
||||||
|
/*Format de la table Utilisateurs
|
||||||
|
+--------+-------------+---------+---------------------+
|
||||||
|
| ID | Pseudo | Actif | Date d'inscription |
|
||||||
|
+--------+-------------+---------+---------------------+
|
||||||
|
Id correspond à l'addresse IP
|
||||||
|
Pseudo : Dernier Pseudo utilisé pour cette adresse IP, va etre remplacé par le pseudo actuel avec majPseudo
|
||||||
|
Date d'inscription comme son nom l'indique le jour de l'inscription de cette utilisateur
|
||||||
|
Actif est un boolean indicant si l'utilisateur est actif
|
||||||
|
|
||||||
|
Chaque communication entres utilisateurs sera stocké dans une table de la forme
|
||||||
|
+------------------+-----------+---------------+---------------+
|
||||||
|
| Destinataire | Source | Message | Date d'envoi |
|
||||||
|
+--------+---------------------+---------------+---------------+
|
||||||
|
Destinataire -> Id du destinataire du message
|
||||||
|
Source -> Id de celui qui envoie le message
|
||||||
|
Message -> Msg envoye
|
||||||
|
Date d'envoie -> Date a laquelle Source a envoye le message a destinataire
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static DataBase instance = null; // Singleton
|
||||||
|
|
||||||
|
public DataBase() {
|
||||||
|
try {
|
||||||
|
// Besoin d'installer le driver JDBC entre java IDE et le system DBMS pour faire un pont entre les deux
|
||||||
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||||
|
System.out.println("Driver Installe");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec installation Driver");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Etablir une connexion , forme : (url, "myLogin", "myPassword");
|
||||||
|
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);
|
||||||
|
System.out.println("Connexion Etablie");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec d'etablissement de la connexion");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DataBase getInstance() {
|
||||||
|
synchronized (DataBase.class) {
|
||||||
|
DataBase DB = instance;
|
||||||
|
if (DB == null) {
|
||||||
|
DB = new DataBase();
|
||||||
|
}
|
||||||
|
return DB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methode permettant de creer une table pour stocker les messages entre deux utilisateurs
|
||||||
|
* @param ID1 Id du premier utilisateur
|
||||||
|
* @param ID2 Id du second utilisateur
|
||||||
|
*/
|
||||||
|
public void CreationTableHistorique(String ID1 , String ID2) {
|
||||||
|
// Pour eviter d'avoir les tables en double
|
||||||
|
String petit;
|
||||||
|
String grand;
|
||||||
|
int comparaison = ID1.compareTo(ID2);
|
||||||
|
if (comparaison < 0) {
|
||||||
|
petit = ID1;
|
||||||
|
grand = ID2 ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
petit = ID2;
|
||||||
|
grand = ID1 ;
|
||||||
|
}
|
||||||
|
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,\n" + " `Message` text NOT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;";
|
||||||
|
System.out.println(Requete);
|
||||||
|
PreparedStatement Ps = null ;
|
||||||
|
//Statement est utilisé pour envoyer une requete SQL à la base de donnee
|
||||||
|
try {
|
||||||
|
Ps = connection.prepareStatement(Requete);
|
||||||
|
System.out.println("Statement cree");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec creation Statement");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute la donnée SQL statement passe en parametre
|
||||||
|
try {
|
||||||
|
Ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(" Echec executeUpdate ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methode 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 Pseudo Nouveau Pseudo de l'utilisateur
|
||||||
|
*/
|
||||||
|
public void majPseudo( String ID , String Pseudo) {
|
||||||
|
String requete= "UPDATE `Utilisateurs` SET `Pseudo`=? WHERE id=?";
|
||||||
|
PreparedStatement Ps = null ;
|
||||||
|
//Statement est utilisé pour envoyer une requete SQL à la base de donnee
|
||||||
|
try {
|
||||||
|
Ps = connection.prepareStatement(requete);
|
||||||
|
Ps.setString(1, Pseudo);
|
||||||
|
Ps.setString(2, ID);
|
||||||
|
System.out.println("Statement cree");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec creation Statement");
|
||||||
|
}
|
||||||
|
//Execute la donnée SQL statement passe en parametre
|
||||||
|
try {
|
||||||
|
Ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(" Echec executeUpdate ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methode permettant de mettre a jour le pseudo d'un utilisateur en fonction de son ID dans la base de donnee
|
||||||
|
* @param IDdest Id de l'utilisateur Destinataire du message
|
||||||
|
* @param IDdest Id de celui qui envoi le message
|
||||||
|
* @param Msg Message envoye entre les deux utilisateurs
|
||||||
|
*/
|
||||||
|
public void ajoutHistorique(String IDdest , String IDsrc, String Msg) {
|
||||||
|
String petit;
|
||||||
|
String grand;
|
||||||
|
int comparaison = IDdest.compareTo(IDsrc);
|
||||||
|
if (comparaison < 0) {
|
||||||
|
petit = IDdest;
|
||||||
|
grand = IDsrc ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
petit = IDsrc;
|
||||||
|
grand = IDdest ;
|
||||||
|
}
|
||||||
|
String nomTable = "Chat_" + petit + "_" + grand ;
|
||||||
|
String requete= "INSERT INTO `"+ nomTable +"`(`Destinataire`, `Source`, `Message`) VALUES ( ? , ? , ?)";
|
||||||
|
PreparedStatement Ps = null ;
|
||||||
|
//Statement est utilisé pour envoyer une requete SQL à la base de donnee
|
||||||
|
try {
|
||||||
|
Ps = connection.prepareStatement(requete);
|
||||||
|
Ps.setString(1, IDdest);
|
||||||
|
Ps.setString(2, IDsrc);
|
||||||
|
Ps.setString(3, Msg);
|
||||||
|
System.out.println("Statement cree");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec creation Statement");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute la donnée SQL statement passe en parametre
|
||||||
|
try {
|
||||||
|
Ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(" Echec executeUpdate ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methode 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 se connecter pour la premiere fois
|
||||||
|
* @param Pseudo pseudo actuelle de l'utilisateur
|
||||||
|
*/
|
||||||
|
public void ajoutUtilisateurs(String ID , String Pseudo ) {
|
||||||
|
String requete= "INSERT INTO `Utilisateurs` (`ID`, `Pseudo`, `Actif`) VALUES ( ? , ? , '1')";
|
||||||
|
PreparedStatement Ps = null ;
|
||||||
|
//Statement est utilisé pour envoyer une requete SQL à la base de donnee
|
||||||
|
try {
|
||||||
|
Ps = connection.prepareStatement(requete);
|
||||||
|
Ps.setString(1, ID);
|
||||||
|
Ps.setString(2, Pseudo);
|
||||||
|
System.out.println("Statement cree");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec creation Statement");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute la donnée SQL statement passe en parametre
|
||||||
|
try {
|
||||||
|
Ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(" Echec executeUpdate ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methode permettant de mettre a jour les utilisateurs actuellement actif
|
||||||
|
* @param ID Id de l'utilisateur qui vient de se connecter ou deconnecter
|
||||||
|
* @param connecte Boolean true si il est connecte , false sinon
|
||||||
|
*/
|
||||||
|
public void majUtilisateursActifs(Boolean Connecte, String Id) {
|
||||||
|
String requete= "UPDATE `Utilisateurs` SET `Actif`=? WHERE id=?";
|
||||||
|
PreparedStatement Ps = null ;
|
||||||
|
Integer Actif = Connecte ? 1 : 0;
|
||||||
|
//Statement est utilisé pour envoyer une requete SQL à la base de donnee
|
||||||
|
try {
|
||||||
|
Ps = connection.prepareStatement(requete);
|
||||||
|
Ps.setInt(1, Actif);
|
||||||
|
Ps.setString(2, Id);
|
||||||
|
System.out.println("Statement cree");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Echec creation Statement");
|
||||||
|
}
|
||||||
|
//Execute la donnée SQL statement passe en parametre
|
||||||
|
try {
|
||||||
|
Ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(" Echec executeUpdate ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,63 +0,0 @@
|
||||||
package chatapp.Model;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Classe permettant de sauvegarder les échanges entre deux utilisateurs
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public class Historique {
|
|
||||||
private Utilisateur User1;
|
|
||||||
private Utilisateur User2;
|
|
||||||
// Liste conservant les differents échanges
|
|
||||||
private ArrayList<MessageHorodate> HistoriqueHorodate ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Constructeur : un historique sauvegarde les echanges entre
|
|
||||||
* User1 et User2
|
|
||||||
* @param User1 - un utilisateur
|
|
||||||
* @param User2 - un second utilisateur
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public Historique(Utilisateur User1, Utilisateur User2) {
|
|
||||||
this.User1 = User1;
|
|
||||||
this.User2 = User2;
|
|
||||||
this.HistoriqueHorodate = new ArrayList<MessageHorodate>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* On ajoute un message échangé dans la liste 'HistoriqueHorodate'
|
|
||||||
*
|
|
||||||
* @param mh - le message horodate échangé
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public void addMessage(MessageHorodate mh) {
|
|
||||||
this.HistoriqueHorodate.add(mh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* getter pour recuperer le second utilisateur
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public Utilisateur getUser2() {
|
|
||||||
return User2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void afficher10derniers() {
|
|
||||||
System.out.println("Demarrage de l'affichage partiel de l'historique");
|
|
||||||
System.out.println("Il y a actuellement " + HistoriqueHorodate.size() +" elements dans l'historique");
|
|
||||||
int n =10;
|
|
||||||
if(HistoriqueHorodate.size()<=10) {
|
|
||||||
n = HistoriqueHorodate.size();
|
|
||||||
}
|
|
||||||
for(int i = 0; i<n;i++) {
|
|
||||||
String exp = HistoriqueHorodate.get(i).getSource().getPseudo();
|
|
||||||
String payload = HistoriqueHorodate.get(i).getMessage();
|
|
||||||
System.out.println(exp+" : "+payload);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,322 +0,0 @@
|
||||||
package chatapp.Protocol;
|
|
||||||
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.PrintStream;
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.DatagramSocket;
|
|
||||||
import java.net.ServerSocket;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.net.SocketException;
|
|
||||||
import java.util.NoSuchElementException;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
import chatapp.Controller.*;
|
|
||||||
import chatapp.Model.*;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Classe representant les échanges TCP entre utilisateurs.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public class TCPEchange {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Equivalent a un handshake.
|
|
||||||
* L'utilisateur associé a app souhaite entamé une discussion avec User2
|
|
||||||
* @param app L'app associé à l'utilisateur qui souhaite entamé la discussion
|
|
||||||
* @param User2 Le destinataire
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public static void demarrerSession(ChatApp app,Utilisateur User2 ) throws IOException {
|
|
||||||
System.out.println("Demmarrage d'une session de clavardage");
|
|
||||||
Socket s = new Socket(User2.getIp(),5000);
|
|
||||||
System.out.println("Socket de demarrage d'une session cree");
|
|
||||||
//ExecutorService exec = Executors.newFixedThreadPool(1000);
|
|
||||||
Thread t1 = new Thread(new RunnerTCPEcoute(s,app));
|
|
||||||
Thread t2 = new Thread(new RunnerTCPEnvoi(s,app,User2,false));
|
|
||||||
t1.start();
|
|
||||||
t2.start();
|
|
||||||
try {
|
|
||||||
t1.join();
|
|
||||||
t2.join();
|
|
||||||
}catch(InterruptedException e) {
|
|
||||||
System.out.println("Un thread s'est arrete brusquement");
|
|
||||||
}
|
|
||||||
System.out.println("Tout s'est passe creme");
|
|
||||||
app.getHist(User2.getPseudo()).afficher10derniers();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*public static void envoiTCP(ChatApp app,Utilisateur User2, String Msg, int type ) {
|
|
||||||
// On cree un messagehorodate
|
|
||||||
MessageHorodate mh = new MessageHorodate(app.getMe(), User2, Msg, type);
|
|
||||||
if( type == 1 ) {
|
|
||||||
// on ajoute le msg à son historique
|
|
||||||
Historique h = app.getHist(User2.getPseudo());
|
|
||||||
h.addMessage(mh);
|
|
||||||
// on update la liste des historiques de app
|
|
||||||
app.majHistorique(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Socket s = new Socket(User2.getIp(), User2.getPort());
|
|
||||||
PrintStream output = new PrintStream(s.getOutputStream());
|
|
||||||
output.println(mh.toString());
|
|
||||||
output.close();
|
|
||||||
s.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Méthode pour qu'un objet de la classe ChatApp soit constamment en écoute de potentielles connexions
|
|
||||||
* @param app L'utilisateur en écoute de potentielles communications
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public static void ecouteTCP(ChatApp app) {
|
|
||||||
ServerSocket ss = null;
|
|
||||||
ExecutorService exec = Executors.newFixedThreadPool(1000);
|
|
||||||
System.out.println("Ecoute TCP activee");
|
|
||||||
try {
|
|
||||||
ss = new ServerSocket(5000); // On ecoute sur le port 5000
|
|
||||||
System.out.println("Socket d'ecoute cree");
|
|
||||||
while(true) { // Ecoute en boucle
|
|
||||||
System.out.println("Attente Session de clavardage");
|
|
||||||
Socket link = ss.accept(); // Blocante
|
|
||||||
exec.submit(new RunnerTCPEcoute(link,app)); // On crée un thread qui va gerer la connexion recu
|
|
||||||
System.out.println("L'ecoute TCP continue apres le premier thread demarre");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Classe representant les threads s'occupant de l'envoie de messages en utilisant le protocole TCP.
|
|
||||||
* Cette classe implemente l'interface Runnable.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
class RunnerTCPEnvoi implements Runnable {
|
|
||||||
private Socket link;
|
|
||||||
private ChatApp app ;
|
|
||||||
private Utilisateur Destinataire;
|
|
||||||
final BufferedReader in;
|
|
||||||
final PrintWriter out;
|
|
||||||
final Scanner sc=new Scanner(System.in);
|
|
||||||
private boolean bonjourEnvoye = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Constructeur de la classe RunnerTCPEnvoi
|
|
||||||
* @param link
|
|
||||||
* @param app Un objet ChatApp dont l'utilisateur associé souhaite entame une discussion
|
|
||||||
* @param user2 Destinataire
|
|
||||||
* @param bonjour Boolean true si c'est le debut d'une connexion, false sinon
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
public RunnerTCPEnvoi(Socket link,ChatApp app, Utilisateur user2, boolean bonjour ) throws IOException {
|
|
||||||
this.link = link;
|
|
||||||
this.app = app;
|
|
||||||
this.Destinataire = user2;
|
|
||||||
this.out = new PrintWriter(link.getOutputStream());
|
|
||||||
this.in = new BufferedReader (new InputStreamReader (link.getInputStream()));
|
|
||||||
this.bonjourEnvoye = bonjour;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
System.out.println("Creation d'un thread d'envoi");
|
|
||||||
String msg;
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
if(!bonjourEnvoye) { // bonjourEnvoye est a false si c'est le debut d'une communication
|
|
||||||
MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),"Bonjour",2);
|
|
||||||
bonjourEnvoye = true;
|
|
||||||
System.out.println("Envoi d'un bonjour");
|
|
||||||
out.println(mh);
|
|
||||||
out.flush();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
try {
|
|
||||||
msg = sc.nextLine();
|
|
||||||
}catch(NoSuchElementException e) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),msg,1);
|
|
||||||
if(msg.equals("--STOP--")) {
|
|
||||||
mh = new MessageHorodate(Destinataire,app.getMe(),msg,0); // ENVOYER JUSTE --STOP-- SUFFIT
|
|
||||||
out.println(mh);
|
|
||||||
out.flush();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* while(!app.isHistoriqueAvailable()) {
|
|
||||||
try{wait();
|
|
||||||
}catch(InterruptedException e) {}
|
|
||||||
}*/
|
|
||||||
//app.setHistoriqueAvailable(false);
|
|
||||||
synchronized( this.app.getMapHistorique()) {
|
|
||||||
Historique h = app.getHist(Destinataire.getPseudo());
|
|
||||||
h.addMessage(mh);
|
|
||||||
app.majHistorique(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
// on update la liste des historiques de app
|
|
||||||
|
|
||||||
//app.majHistorique2(mh.toString(),Destinataire.getPseudo());
|
|
||||||
//app.setHistoriqueAvailable(false);
|
|
||||||
//notifyAll();
|
|
||||||
out.println(mh);
|
|
||||||
System.out.println("Envoi d'un mesage");
|
|
||||||
out.flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
System.out.println("Fermeture du thread d'envoi");
|
|
||||||
in.close();
|
|
||||||
link.close();
|
|
||||||
}catch(Exception e) {
|
|
||||||
// Gestion de l'exception de la fermeture de la socket
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Classe representant les threads s'occupant de la reception de messages en utilisant le protocole TCP.
|
|
||||||
* Cette classe implemente l'interface Runnable.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
class RunnerTCPEcoute implements Runnable {
|
|
||||||
final Socket link;
|
|
||||||
private ChatApp app ;
|
|
||||||
private Utilisateur u2;
|
|
||||||
private boolean u2Initialise;
|
|
||||||
public RunnerTCPEcoute(Socket link,ChatApp app ) {
|
|
||||||
this.link = link;
|
|
||||||
this.app = app;
|
|
||||||
this.u2Initialise=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
System.out.println("Creation d'un thread d'ecoute");
|
|
||||||
try {
|
|
||||||
PrintStream output = new PrintStream(link.getOutputStream());
|
|
||||||
//InputStream is = link.getInputStream();
|
|
||||||
BufferedReader in = new BufferedReader (new InputStreamReader (link.getInputStream()));
|
|
||||||
|
|
||||||
String line = "";
|
|
||||||
String dest = "";
|
|
||||||
String src = "";
|
|
||||||
String type = "";
|
|
||||||
String date = "";
|
|
||||||
String payload = "";
|
|
||||||
String msg = "";
|
|
||||||
line = in.readLine();
|
|
||||||
while (line != null) {
|
|
||||||
|
|
||||||
|
|
||||||
if(line.split("::")[0].equals("Destinataire")) {
|
|
||||||
if(msg.equals("")) {
|
|
||||||
dest = line+"\n";
|
|
||||||
msg=".";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg=dest+src+type+date+payload;
|
|
||||||
payload = "";
|
|
||||||
MessageHorodate mh = MessageHorodate.stringToMessageHorodate(msg);
|
|
||||||
System.out.println("Type du message:"+mh.getType());
|
|
||||||
if(mh.getType()==1) {
|
|
||||||
/*while(!app.isHistoriqueAvailable()) {
|
|
||||||
try{wait();
|
|
||||||
}catch(InterruptedException e) {}
|
|
||||||
}
|
|
||||||
app.setHistoriqueAvailable(false);*/
|
|
||||||
System.out.println("Historique mis à jour lors de la reception");
|
|
||||||
Historique h = app.getHist(mh.getSource().getPseudo());
|
|
||||||
h.addMessage(mh);
|
|
||||||
app.majHistorique(h);
|
|
||||||
//app.setHistoriqueAvailable(true);
|
|
||||||
//notifyAll();
|
|
||||||
//app.majHistorique2(mh,mh.getSource().getPseudo());
|
|
||||||
}
|
|
||||||
else if(mh.getType()==0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(line.split("::")[0].equals("Source")) {
|
|
||||||
src = line+"\n";
|
|
||||||
if(!u2Initialise) {
|
|
||||||
u2=Utilisateur.stringToUtilisateur(src.split("::")[1].replaceAll("\n", ""));
|
|
||||||
System.out.println("u2Initialise !");
|
|
||||||
u2Initialise = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(line.split("::")[0].equals("Type")) {
|
|
||||||
if(line.split("::")[1].equals("2")) {
|
|
||||||
System.out.println("Bonjour recu!");
|
|
||||||
//System.out.println(src.split("::")[1].replaceAll("\n", ""));
|
|
||||||
u2=Utilisateur.stringToUtilisateur(src.split("::")[1].replaceAll("\n", ""));
|
|
||||||
u2Initialise = true;
|
|
||||||
System.out.println("Pseudo du poto: >>"+u2.getPseudo()+"<<");
|
|
||||||
Thread t = new Thread(new RunnerTCPEnvoi(link,app,u2,true));
|
|
||||||
t.start();
|
|
||||||
System.out.println("Thread d'envoi envoye");
|
|
||||||
}
|
|
||||||
type = line+"\n";
|
|
||||||
}
|
|
||||||
else if(line.split("::")[0].equals("Date")) {
|
|
||||||
date = line+"\n";
|
|
||||||
}
|
|
||||||
else if(line.split("::")[0].equals("Message")){
|
|
||||||
payload = line+"\n";
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
payload += line+"\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println("Received: "+ line);
|
|
||||||
line = in.readLine();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
System.out.println("Affichage de l'histo");
|
|
||||||
System.out.println("Pseudo du poto: >>"+u2.getPseudo()+"<<");
|
|
||||||
app.getHist(u2.getPseudo()).afficher10derniers();
|
|
||||||
in.close();
|
|
||||||
link.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
//e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
System.out.println("Finishing thread");
|
|
||||||
System.out.println("Affichage de l'histo");
|
|
||||||
System.out.println("Pseudo du poto: >>"+u2.getPseudo()+"<<");
|
|
||||||
app.getHist(u2.getPseudo()).afficher10derniers();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -10,6 +10,7 @@ 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;
|
||||||
|
import javafx.application.Platform;
|
||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
|
@ -17,6 +18,7 @@ import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.TextArea;
|
import javafx.scene.control.TextArea;
|
||||||
import javafx.scene.control.TextField;
|
import javafx.scene.control.TextField;
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
public class Clavardage implements Initializable, PropertyChangeListener {
|
public class Clavardage implements Initializable, PropertyChangeListener {
|
||||||
|
|
||||||
|
@ -83,6 +85,15 @@ public class Clavardage implements Initializable, PropertyChangeListener {
|
||||||
msg+=": "+msgh.getMessage();
|
msg+=": "+msgh.getMessage();
|
||||||
ChatText.appendText(msg);
|
ChatText.appendText(msg);
|
||||||
break;
|
break;
|
||||||
|
case "FinDeLaSession" :
|
||||||
|
this.session.arretSession();
|
||||||
|
Platform.runLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Stage stage = (Stage) AEnvoyer.getScene().getWindow();
|
||||||
|
stage.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Laddar…
Referens i nytt ärende