Ajout de commentaire
This commit is contained in:
父節點
4e188d0258
當前提交
8490d5caad
共有 11 個文件被更改,包括 170 次插入 和 37 次删除
|
@ -1,19 +1,31 @@
|
|||
package chatapp.Controller;
|
||||
|
||||
import chatapp.Model.*;
|
||||
import chatapp.Protocol.*;
|
||||
import chatapp.Model.DataBase;
|
||||
import chatapp.Model.ListUtilisateurs;
|
||||
import chatapp.Model.Utilisateur;
|
||||
import chatapp.Protocol.RunnerEcouteTCP;
|
||||
import chatapp.Protocol.RunnerEcouteUDP;
|
||||
import chatapp.Protocol.SessionClavardage;
|
||||
import chatapp.Protocol.UDPEchange;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* <p> Controller de l'application. C'est par cette méthode que chaque connexion et chaque session sont entamees
|
||||
* Les differents attributs sont:
|
||||
* actifsUsers: qui est la liste des utilisateurs actifs actuellement et connus par l'application
|
||||
* me: qui est l'instance de la classe Utilisateur représentant l'utilisateur se connectant via cette instance de chatapp
|
||||
* main: l'application de l'interface graphique qui s'occupe d'instancier chatapp
|
||||
* runnerEcouteTCP: instance de runnerEcouteTCP, Thread permettant de recevoir des demandes de clavardage
|
||||
* runnerEcouteUDP: instance de runnerEcouteUDP; Thread permettant de communiquer en UDP pour recevoir les demandes de connexion, deconnexion, changements de pseudo et leurs réponses associées
|
||||
* connecte: booleen indiquant si l'on est connecte sur le reseau ou non
|
||||
* db: instance permettant de se connecter à la base de donnees centralisee
|
||||
* </p>
|
||||
*/
|
||||
public class ChatApp implements PropertyChangeListener {
|
||||
|
||||
/* Liste des utilisateurs actifs */
|
||||
|
@ -44,8 +56,7 @@ public class ChatApp implements PropertyChangeListener {
|
|||
public ChatApp(String pseudo, Integer port, Application main){
|
||||
this.actifUsers = new ListUtilisateurs() ;
|
||||
// Recuperer adresse IP de l'utilisateur
|
||||
InetAddress ip = null ;
|
||||
ip = UDPEchange.getCurrentIp();
|
||||
InetAddress ip = UDPEchange.getCurrentIp();
|
||||
this.me = new Utilisateur(pseudo,port,ip);
|
||||
this.actifUsers.addList(getMe());
|
||||
|
||||
|
|
|
@ -2,15 +2,28 @@ package chatapp.Protocol;
|
|||
|
||||
import chatapp.Controller.ChatApp;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe permettant de gérer les multiples connexions en UDP.
|
||||
* Extend la classe Thread.
|
||||
* </p>
|
||||
*/
|
||||
public class RunnerEcouteUDP extends Thread {
|
||||
ChatApp app ;
|
||||
/**
|
||||
* Constructeur
|
||||
* @param app Un RunnerEcouteUDP est toujours associé a une application de Chat
|
||||
*/
|
||||
public RunnerEcouteUDP(ChatApp app) {
|
||||
this.app = app ;
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode qui vient ecraser la méthode run de la classe Thread.
|
||||
* La méthode 'ecouteUDP' est appele.
|
||||
*/
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
UDPEchange.ecouteUDP(app);
|
||||
|
||||
}
|
||||
}
|
|
@ -17,6 +17,19 @@ import chatapp.Model.Utilisateur;
|
|||
import chatapp.View.FenetreSession;
|
||||
import javafx.application.Platform;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe représentant une session de clavrdage.
|
||||
* 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.
|
||||
* Elle possède en attribut:
|
||||
* link: la socket associée à la session de clavardage
|
||||
* u2: l'utilisateur avec lequel on communique
|
||||
* out: le flux de donnees sortant
|
||||
* in: le flux de donnees entrant
|
||||
* pcs: Le PropertyChangeSupport permettant d'envoyer les notifications de MessageRecu et de FindeSession
|
||||
* derniersMsg: la liste temporaire des derniers messages recus
|
||||
* </p>
|
||||
*/
|
||||
public class SessionClavardage extends Thread {
|
||||
private Socket link;
|
||||
private ChatApp app;
|
||||
|
@ -26,6 +39,12 @@ public class SessionClavardage extends Thread {
|
|||
private PropertyChangeSupport pcs;
|
||||
private ArrayList<MessageHorodate> derniersMsg; // on met temporairement les derniers msgs pour éviter les pb de synchro inter-threads
|
||||
private int SessionID;
|
||||
|
||||
/**
|
||||
* <p> Ce constructeur crée une session de clavardage quand on recoit une requete</p>
|
||||
* @param link la socket associee a la requete TCP que l'on a recu
|
||||
* @param app l'instance de chatapp
|
||||
*/
|
||||
public SessionClavardage(Socket link, ChatApp app) {
|
||||
this.setLink(link);
|
||||
this.setApp(app);
|
||||
|
@ -45,6 +64,11 @@ public class SessionClavardage extends Thread {
|
|||
this.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p> Le constructeur associe a l'envoi d'une requete TCP, lorsque que l'on veut initier une session de clavardage avec un utilisateur connecte</p>
|
||||
* @param u2 l'utilisateur avec qui l'on souhaite démarrer une session de clavardage
|
||||
* @param app l'instance de chataap associee
|
||||
*/
|
||||
public SessionClavardage(Utilisateur u2, ChatApp app) {
|
||||
this.setU2(u2);
|
||||
this.setApp(app);
|
||||
|
@ -65,12 +89,18 @@ public class SessionClavardage extends Thread {
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Permet aux PropertyChangeListener de s'abonner aux notifications des evenements
|
||||
* @param pcl le PropertyListener qui souhaite s'abonner sur ce PropertyChangeSupport
|
||||
*/
|
||||
public void addPropertyChangeListener(PropertyChangeListener pcl){
|
||||
this.pcs.addPropertyChangeListener("MessageRecu",pcl);
|
||||
this.pcs.addPropertyChangeListener("FinDeLaSession",pcl);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p> Methode permettant d'arreter cette session de clavardage et de prevenir l'autre utilisateur de la fin de la session</p>
|
||||
*/
|
||||
public void arretSession() {
|
||||
MessageHorodate msgh = new MessageHorodate(getU2(),getApp().getMe(),".",2);
|
||||
try {
|
||||
|
@ -86,6 +116,11 @@ public class SessionClavardage extends Thread {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 a envoyer
|
||||
*/
|
||||
public void envoiMsg(String msg) {
|
||||
MessageHorodate msgh = new MessageHorodate(getU2(),getApp().getMe(),msg,1);
|
||||
try {
|
||||
|
@ -97,12 +132,19 @@ public class SessionClavardage extends Thread {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p> Methode permettant de recuperer le dernier message recu qui a ete mis dans la liste des messages recus.
|
||||
* Utilisee par l'interface graphique qui a ete avertie grace au PropertyChangeSupport</p>
|
||||
* @return le dernier message horodate recu
|
||||
*/
|
||||
public MessageHorodate getDernierMsg() {
|
||||
return this.derniersMsg.remove(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* <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() {
|
||||
String plaintext = null;
|
||||
MessageHorodate msg = null;
|
||||
|
@ -134,52 +176,84 @@ public class SessionClavardage extends Thread {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter
|
||||
* @return le flux d'ecriture des messages sortant
|
||||
*/
|
||||
public ObjectOutputStream getOut() {
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter
|
||||
* @param out le flux d'ecriture des messages sortant
|
||||
*/
|
||||
public void setOut(ObjectOutputStream out) {
|
||||
this.out = out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter
|
||||
* @return le flux de lecture des messages entrant
|
||||
*/
|
||||
public ObjectInputStream getIn() {
|
||||
return in;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter
|
||||
* @param in le flux de lecture des messages entrant
|
||||
*/
|
||||
public void setIn(ObjectInputStream in) {
|
||||
this.in = in;
|
||||
}
|
||||
|
||||
public Socket getLink() {
|
||||
return link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter
|
||||
* @param link la Socket asscciee a la connexion TCP et donc a la session
|
||||
*/
|
||||
public void setLink(Socket link) {
|
||||
this.link = link;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter
|
||||
* @return l'instance de chatApp
|
||||
*/
|
||||
public ChatApp getApp() {
|
||||
return app;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter
|
||||
* @param app l'instance de chatApp
|
||||
*/
|
||||
public void setApp(ChatApp app) {
|
||||
this.app = app;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter
|
||||
* @return l'utilisateur avec lequel on communique
|
||||
*/
|
||||
public Utilisateur getU2() {
|
||||
return u2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter
|
||||
* @param u2 l'utilisateur avec lequel on communique
|
||||
*/
|
||||
public void setU2(Utilisateur u2) {
|
||||
this.u2 = u2;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Getter
|
||||
* @return SessionID
|
||||
*/
|
||||
public int getSessionID() {
|
||||
return SessionID;
|
||||
}
|
||||
|
||||
public void setSessionID(int sessionID) {
|
||||
SessionID = sessionID;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import chatapp.Model.*;
|
|||
* Classe representant les echanges UDP entre utilisateurs.
|
||||
* </p>
|
||||
*/
|
||||
|
||||
public class UDPEchange {
|
||||
|
||||
private static Boolean Connecte = true;
|
||||
|
|
|
@ -16,7 +16,11 @@ package chatapp.View;
|
|||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant l'interface graphique permettant de changer de pseudo
|
||||
* </p>
|
||||
*/
|
||||
public class ChangementPseudo {
|
||||
|
||||
@FXML // ResourceBundle that was given to the FXMLLoader
|
||||
|
@ -47,6 +51,7 @@ public class ChangementPseudo {
|
|||
@FXML
|
||||
/**
|
||||
* <p> Handler permettant de retourner au menu principal sur pression du MenuButton</p>
|
||||
* @param event L'utilisateur vient d'appuyer sur le bouton Retour au menu
|
||||
*/
|
||||
void retourMenu(ActionEvent event) {
|
||||
System.out.println("Retour au menu principal");
|
||||
|
@ -65,6 +70,7 @@ public class ChangementPseudo {
|
|||
@FXML
|
||||
/**
|
||||
* <p> Handler permettant de lancer la verrification de l'unicite du ppseudo sur pression du validtionButton</p>
|
||||
* @param event L'utilisateur vient d'appuyer sur le bouton Valider pseudo
|
||||
*/
|
||||
void validerPseudo(ActionEvent event) {
|
||||
boolean pseudoOK = false;
|
||||
|
|
|
@ -23,6 +23,11 @@ import javafx.scene.control.TextField;
|
|||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant l'interface graphique permettant de clavarder avec un utilisateur.
|
||||
* </p>
|
||||
*/
|
||||
public class Clavardage implements Initializable, PropertyChangeListener {
|
||||
@FXML //fx:id="plusButton"
|
||||
public Button plusButton;
|
||||
|
@ -53,6 +58,7 @@ public class Clavardage implements Initializable, PropertyChangeListener {
|
|||
@FXML
|
||||
/**
|
||||
* <p>Handler gerant l'envoi du message contenu dans le TextField AEnvoyer et sur pression du bouton EnvoyerButton</p>
|
||||
* @param event L'utilisateur vient d'appuyer sur le bouton Envoyer
|
||||
*/
|
||||
void envoyerMessage(ActionEvent event) {
|
||||
String msg = AEnvoyer.getText();
|
||||
|
@ -73,9 +79,7 @@ public class Clavardage implements Initializable, PropertyChangeListener {
|
|||
* @param session la session a associer a la classe
|
||||
*/
|
||||
public void setSession(SessionClavardage session) {
|
||||
|
||||
this.session = session;
|
||||
|
||||
this.session.addPropertyChangeListener(this);
|
||||
this.u2=session.getU2();
|
||||
this.pseudonyme1.setText(u2.getPseudo());
|
||||
|
@ -128,7 +132,7 @@ public class Clavardage implements Initializable, PropertyChangeListener {
|
|||
|
||||
/**
|
||||
* <p> Permet de recepurer plus de messages stoces dans la database en appuyant sur le bouton plusButton</p>
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur a appuye sur le bouton plus pour obtenir tout l'utilisateur
|
||||
*/
|
||||
public void ajouterMessagesHistorique(ActionEvent actionEvent) {
|
||||
this.nomTable = this.session.getApp().getDb().getNomTable(u2,this.session.getApp().getMe());
|
||||
|
|
|
@ -16,7 +16,12 @@ import javafx.scene.control.Button;
|
|||
import javafx.scene.control.RadioButton;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant l'interface graphique permettant de se connecter.
|
||||
* L'utilisateur rentre un pseudo et choisit une connexion distante ou locale.
|
||||
* </p>
|
||||
*/
|
||||
public class ConnexionScreen {
|
||||
|
||||
public Button connexionButton;
|
||||
|
@ -40,11 +45,12 @@ public class ConnexionScreen {
|
|||
/**
|
||||
* <p>Handler permettant de lancer la connexion avec le pseudonyme contenu dans le TextField pseudonyme en appuyant sur le connexionButton
|
||||
* </p>
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur vient d'appuyer sur le bouton connexion
|
||||
*/
|
||||
public void connexion(ActionEvent actionEvent) {
|
||||
Boolean connexion = false;
|
||||
if(this.localButton.isSelected()) {
|
||||
// PARTIE CONNEXION LOCALE
|
||||
try {
|
||||
connexion = ChatApp.getInstance().connexion(pseudonyme.getText());
|
||||
} catch (IOException e) {
|
||||
|
|
|
@ -20,7 +20,11 @@ import javafx.scene.Scene;
|
|||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant l'interface graphique permettant de choisir un utilisateur avec qui clavarder.
|
||||
* </p>
|
||||
*/
|
||||
public class DemarrerSession {
|
||||
|
||||
@FXML // ResourceBundle that was given to the FXMLLoader
|
||||
|
@ -38,7 +42,7 @@ public class DemarrerSession {
|
|||
|
||||
/**
|
||||
* <p> Handler permettant de demarrer une session de clavardage avec le contact choisi dans la comboBox choixContaact</p>
|
||||
* @param event
|
||||
* @param event L'utilisateur vient de selectionner un utilisateur
|
||||
*/
|
||||
@FXML
|
||||
void demarrerSessionAvec(ActionEvent event) {
|
||||
|
@ -47,6 +51,7 @@ public class DemarrerSession {
|
|||
|
||||
/**
|
||||
* <p> Handler permettant de retourner au menu principal sur pression du MenuButton</p>
|
||||
* @param event L'utilisateur vient d'appuyer sur le bouton Retour au menu
|
||||
*/
|
||||
@FXML
|
||||
void retourMenu(ActionEvent event) {
|
||||
|
|
|
@ -10,11 +10,16 @@ import javafx.stage.WindowEvent;
|
|||
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe permettant d'ouvrir une nouvelle fenetre afin de clavarder avec un utilisateur.
|
||||
* </p>
|
||||
*/
|
||||
public class FenetreSession extends Stage {
|
||||
SessionClavardage session;
|
||||
/**
|
||||
* <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
|
||||
*/
|
||||
public FenetreSession(SessionClavardage session) {
|
||||
FXMLLoader fichier = new FXMLLoader(getClass().getResource("/fenetres/View_Clavardage.fxml"));
|
||||
|
|
|
@ -15,7 +15,12 @@ import javafx.scene.Scene;
|
|||
import javafx.scene.control.MenuItem;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant la page d'acceuil. Elle est composé d'un menu en haut a gauche.
|
||||
* Au centre un petit message "Bienvenue" suivi du pseudo de l'utilisateur est affiché.
|
||||
* </p>
|
||||
*/
|
||||
public class View_Menu {
|
||||
|
||||
public Text pseudonyme;
|
||||
|
@ -36,7 +41,7 @@ public class View_Menu {
|
|||
|
||||
/**
|
||||
* <p>Handler permettant d'aller a la scene View_Utilisateurs pour afficher la liste des utilisateurs actifs</p>
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur a choisit l'option afficher utilisateurs actifs dans le menu
|
||||
*/
|
||||
public void afficherUtilsActifs(ActionEvent actionEvent) {
|
||||
Stage stage = (Stage) pseudonyme.getScene().getWindow();
|
||||
|
@ -53,7 +58,7 @@ public class View_Menu {
|
|||
|
||||
/**
|
||||
* <p>Handler permettant d'aller a la scene Demarrer_Session pour choisir un utilisateur avec qui clavarder
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur a choisit l'option de demarrer une session de clavardage dans le menu
|
||||
*/
|
||||
public void demarrerSession(ActionEvent actionEvent) {
|
||||
Stage stage = (Stage) pseudonyme.getScene().getWindow();
|
||||
|
@ -70,7 +75,7 @@ public class View_Menu {
|
|||
|
||||
/**
|
||||
* <p>Handler permettant d'aller a la scene View_ChangementPseudo pour changer son pseudonyme
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur a choisit l'option changer de pseudo
|
||||
*/
|
||||
public void changerPseudo(ActionEvent actionEvent) {
|
||||
Stage stage = (Stage) pseudonyme.getScene().getWindow();
|
||||
|
@ -87,7 +92,7 @@ public class View_Menu {
|
|||
|
||||
/**
|
||||
* <p>Handler permettant de se deconnecter et fermer l'application
|
||||
* @param actionEvent
|
||||
* @param actionEvent L'utilisateur a choisit l'option Deconnexion dans le menu
|
||||
*/
|
||||
public void deconnexion(ActionEvent actionEvent) {
|
||||
try {
|
||||
|
|
|
@ -15,7 +15,11 @@ import javafx.scene.Scene;
|
|||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.TextArea;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Classe representant l'interface graphique permettant d'afficher les utilisateurs actifs
|
||||
* </p>
|
||||
*/
|
||||
public class View_Utilisateurs {
|
||||
|
||||
public TextArea ListeUtilisateurs;
|
||||
|
@ -41,6 +45,7 @@ public class View_Utilisateurs {
|
|||
|
||||
/**
|
||||
* <p> Handler permettant de retourner au menu principal sur pression du MenuButton</p>
|
||||
* @param actionEvent L'utilisateur vient d'appuyer sur le bouton Retour au menu
|
||||
*/
|
||||
public void retourMenu(ActionEvent actionEvent) {
|
||||
Stage stage = (Stage) MenuButton.getScene().getWindow();
|
||||
|
|
載入中…
Reference in a new issue