Nouvelle interface graphique
This commit is contained in:
parent
8794238d89
commit
c4eccf38a9
8 changed files with 269 additions and 447 deletions
|
@ -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">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<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="sourceFolder" forTests="false" />
|
||||
</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
|
||||
chatapp/Model/MessageHorodate.java
|
||||
chatapp.Model.MessageHorodate
|
||||
chatapp/Model/Utilisateur.java
|
||||
chatapp.Model.Utilisateur
|
||||
chatapp/Model/Historique.java
|
||||
chatapp.Model.Historique
|
||||
chatapp/Launcher.java
|
||||
chatapp.Launcher
|
||||
chatapp/Model/MessageHorodate.java
|
||||
chatapp.Model.MessageHorodate
|
||||
chatapp/Model/DataBase.java
|
||||
chatapp.Model.DataBase
|
||||
chatapp/Protocol/RunnerEcouteTCP.java
|
||||
chatapp.Protocol.RunnerEcouteTCP
|
||||
chatapp/View/FenetreSession.java
|
||||
|
@ -30,6 +32,7 @@ chatapp/Main.java
|
|||
chatapp.Main
|
||||
chatapp/View/Clavardage.java
|
||||
chatapp.View.Clavardage
|
||||
chatapp.View.Clavardage$1
|
||||
chatapp/Protocol/SessionClavardage.java
|
||||
chatapp.Protocol.SessionClavardage
|
||||
chatapp/View/ConnexionScreen.java
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package chatapp.Controller;
|
||||
|
||||
import chatapp.Model.Historique;
|
||||
import chatapp.Model.ListUtilisateurs;
|
||||
import chatapp.Model.MessageHorodate;
|
||||
import chatapp.Model.Utilisateur;
|
||||
import chatapp.Model.*;
|
||||
import chatapp.Protocol.*;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
|
@ -22,9 +19,7 @@ public class ChatApp implements PropertyChangeListener {
|
|||
/* Liste des utilisateurs actifs */
|
||||
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 */
|
||||
private Utilisateur me;
|
||||
|
@ -36,7 +31,7 @@ public class ChatApp implements PropertyChangeListener {
|
|||
private static ChatApp chatapp = null;
|
||||
private RunnerEcouteTCP runnerEcouteTCP;
|
||||
private RunnerEcouteUDP runnerEcouteUDP;
|
||||
|
||||
private DataBase db;
|
||||
|
||||
/**
|
||||
* Constructeur de l'application de chat
|
||||
|
@ -51,8 +46,9 @@ public class ChatApp implements PropertyChangeListener {
|
|||
ip = UDPEchange.getCurrentIp();
|
||||
this.me = new Utilisateur(pseudo,port,ip);
|
||||
this.actifUsers.addList(getMe());
|
||||
this.mapHistorique = new HashMap<String,Historique>() ;
|
||||
|
||||
this.main = main;
|
||||
//this.db= DataBase.getInstance();
|
||||
}
|
||||
|
||||
public static synchronized ChatApp getInstance(String pseudo, Integer port, Application main){
|
||||
|
@ -66,14 +62,7 @@ public class ChatApp implements PropertyChangeListener {
|
|||
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) {
|
||||
Historique h = getMapHistorique().get(pseudo);
|
||||
|
@ -81,18 +70,6 @@ public class ChatApp implements PropertyChangeListener {
|
|||
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
|
||||
|
@ -230,29 +207,8 @@ public class ChatApp implements PropertyChangeListener {
|
|||
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 {
|
||||
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
|
||||
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.Utilisateur;
|
||||
import chatapp.Protocol.SessionClavardage;
|
||||
import javafx.application.Platform;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
|
@ -17,6 +18,7 @@ import javafx.scene.control.Button;
|
|||
import javafx.scene.control.TextArea;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class Clavardage implements Initializable, PropertyChangeListener {
|
||||
|
||||
|
@ -83,6 +85,15 @@ public class Clavardage implements Initializable, PropertyChangeListener {
|
|||
msg+=": "+msgh.getMessage();
|
||||
ChatText.appendText(msg);
|
||||
break;
|
||||
case "FinDeLaSession" :
|
||||
this.session.arretSession();
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Stage stage = (Stage) AEnvoyer.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue