clean + comments

このコミットが含まれているのは:
Elise Barnabe 2021-02-13 10:22:15 +01:00
コミット ef7515bc0c
50個のファイルの変更322行の追加245行の削除

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

バイナリファイルは表示されません。

ファイルの表示

@ -5,8 +5,8 @@
"port": 8080
},
"config":{
"interface": "wlan3",
"portSrc": 26001,
"portDest":26000
"interface": "wlan4",
"portSrc": 26000,
"portDest":26001
}
}

ファイルの表示

@ -7,8 +7,8 @@ public class Configuration {
private SConf sConf;
private Conf conf;
private SConf sConf; //Configuration du serveur
private Conf conf; //Configuration réseau
public Configuration() {

ファイルの表示

@ -30,9 +30,7 @@ public class Agent implements PropertyChangeListener{
private Contact user;
private UDPInput BIn;
private UDPOutput BOut;
//private TCPChat TCPSend;
private TCPServer server;
//private ListeContacts list;
private InetAddress localAddress;
private InetAddress broadcast;
private ArrayList<TCPChat> listTCPOk;
@ -43,15 +41,13 @@ public class Agent implements PropertyChangeListener{
private boolean open = true;
//Création d'un agent lors de l'inscription (première connexion)
public Agent(InetAddress address, int portIn, int portOut) throws IOException {
this.user = new Contact("", address, portIn);
this.BIn = new UDPInput(user.getAddress(), portIn);
this.BOut = new UDPOutput(user, portOut);
this.server = new TCPServer(user.getPort(), user.getAddress());
this.server.addPropertyChangeListener(this);
//this.TCPSend = new TCPChat(user);
//this.list = ListeContacts.getInstance();
this.localAddress=Tools.getAdress()[0];
this.broadcast= Tools.getAdress()[1];
this.db = DataBase.getInstance();
@ -62,7 +58,7 @@ public class Agent implements PropertyChangeListener{
BIn.start();
}
//user ayant déjà fait une connexion
//Création d'un agent par un user ayant déjà fait une connexion
public Agent(InetAddress address, int portIn, int portOut, String login) throws IOException {
this.db = DataBase.getInstance();
this.user = new Contact(db.getPseudoFromLogin(login), address, portIn);
@ -70,8 +66,6 @@ public class Agent implements PropertyChangeListener{
this.BOut = new UDPOutput(user, portOut);
this.server = new TCPServer(user.getPort(), user.getAddress());
this.server.addPropertyChangeListener(this);
//this.TCPSend = new TCPChat(user);
//this.list = ListeContacts.getInstance();
this.localAddress=Tools.getAdress()[0];
this.broadcast= Tools.getAdress()[1];
this.listTCPOk = new ArrayList<TCPChat>();
@ -85,7 +79,6 @@ public class Agent implements PropertyChangeListener{
public void propertyChange(PropertyChangeEvent evt) {
switch (evt.getPropertyName()) {
case "Msg UDP Recu" :
//System.out.println("envoi message");
Message msg = BIn.getMessage();
try {
handleMessage(msg);
@ -94,7 +87,6 @@ public class Agent implements PropertyChangeListener{
}
break;
case "session chat demarree" :
//System.out.println("dans session demarree");
TCPChat tcpChat = this.server.getConnexionTCPChat();
tcpChat.addPropertyChangeListener(this);
this.listTCPOk.add(tcpChat);
@ -105,10 +97,8 @@ public class Agent implements PropertyChangeListener{
SimpleAttributeSet left = new SimpleAttributeSet();
StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT);
StyleConstants.setForeground(left, c.brighter());
//System.out.println("dans property change");
TCPChat tcpChatCo = this.listTCPOk.get(0);
MessageChat msgRecu = tcpChatCo.getMessageRecu();
//FenetreChat.getTa().append("kevin"+ " : "+msgRecu.getMessage()+"\n");
if(FenetreChat.isOuvert()) {
StyledDocument doc = FenetreChat.getDoc();
try {
@ -127,55 +117,56 @@ public class Agent implements PropertyChangeListener{
/*type 0 : premier message de broadcast
/* type 0 : premier message de broadcast
* type, 1 : deuxieme message de broadcast avec pseudo
* type 2 : Message de déconnexion
* type 3 : message pseudo changé
* type 4 : Message affichage
* type 5 : Message chat
*/
public void handleMessage(Message msg) throws IOException {
switch(msg.getTypeMessage()) {
//message broadcast sans pseudo pour signaler son arrivée
//action : répondre par un message avec notre pseudo
case 0 :
//System.out.println("Envoi message présentation");
MessagePseudo msgPresentation = new MessagePseudo(this.localAddress, msg.getAddressSrc(), this.user.getPort(), msg.getPortSrc(), 1, this.user.getPseudo(), this.user.getId(), "");
BOut.send(msgPresentation, msg.getAddressSrc(), msg.getPortSrc());
break;
//message broadcast avec pseudo
//action : on vérifie que le pseudo appartient à une personne active dans la liste du serveur et on l'ajoute dans la liste de la fenetre menu
case 1 :
MessagePseudo msgPseudo = (MessagePseudo) msg;
boolean pseudoExist = Request.sendPseudo(msgPseudo.getPseudo(), "pseudoOK");
if(!pseudoExist) {
Contact newUser = new Contact(msgPseudo.getPseudo(), msgPseudo.getAddressSrc(), msgPseudo.getPortSrc());
//Request.sendUser(msgPseudo.getPseudo(), msgPseudo.getAddressSrc().toString(), Integer.toString(msgPseudo.getPortSrc()), "addUser");
//list.addContact(newUser);
if(FenetreMenu.ouvert) {
FenetreMenu.getCb().addItem(newUser.getPseudo());
}
}
break;
//message de deconnexion
//action : vérifier que le pseudo n'existe plus dans la liste des actifs du serveur et le supprimer de la liste de la fenetre menu
//fermeture de la fenetre chat entre le user et la personne qui se deconnecte si elle est ouverte
case 2 :
MessagePseudo messageDeconnexion = (MessagePseudo) msg;
boolean pseudoExiste = Request.sendPseudo(messageDeconnexion.getPseudo(), "pseudoOK");
if(pseudoExiste){
//Request.sendDeconnexion(Integer.toString(messageDeconnexion.getId()),messageDeconnexion.getPseudo(), "deconnexion");
FenetreMenu.getCb().removeItem(messageDeconnexion.getPseudo());
}
//fermeture de la fenetre chat le user et la personne qui se deconnecte
if(FenetreChat.isOuvert()&&FenetreChat.getDest().getPseudo().equals(messageDeconnexion.getPseudo())) {
FenetreChat.fermer();
//getTCPChat().getSocket().close();
}
break;
//message pseudo changé
//action : mettre à jour la liste des users de la fenetre pseudo avec le nouveau pseudo
case 3 :
MessagePseudo messageNewPseudo = (MessagePseudo) msg;
this.open = false;
//Contact contact = list.findContact(messageNewPseudo.getPseudo());
//int id = this.db.getIdFromPseudo(contact.getPseudo());
for(int i = 0 ; i<FenetreMenu.getCb().getItemCount() ; i++){//Combo étant ton JComboBox
for(int i = 0 ; i<FenetreMenu.getCb().getItemCount() ; i++){
String pseudo = (String) FenetreMenu.getCb().getItemAt(i);
if(pseudo.equals(messageNewPseudo.getAncienPseudo())) {
FenetreMenu.getCb().removeItem(pseudo);
@ -186,18 +177,27 @@ public class Agent implements PropertyChangeListener{
}
//Première connexion -> inscription
public boolean connectInscription(String pseudo, String login) throws IOException, InterruptedException {
//Envoi d'un message de broadcast sans pseudo
MessagePseudo msg_connexion = new MessagePseudo(this.localAddress, this.broadcast, this.user.getPort(), App.portDest, 0, "", this.user.getId(), "");
BOut.send(msg_connexion, this.broadcast, App.portDest);
//Attente pour avoir le temps de recevoir les réponses des users actifs
Thread.sleep(2000);
//On gère toutes les réponses reçues après notre broadcast
ArrayList<MessagePseudo> msg_recus = BIn.getListMessage();
for(int i =0; i<msg_recus.size(); i++) {
handleMessage(msg_recus.get(i));
}
//Choix du pseudo
boolean pseudoOK = choisirPseudo(pseudo);
//list.addContact(user);
//Si le pseudo est acceptable :
//Envoi d'un message de broadcast avec le pseudo
if(pseudoOK){
Request.sendUser(pseudo, this.localAddress.toString(), Integer.toString(App.portSrc), "addUser");
int id = db.addUser(pseudo, login);
@ -205,23 +205,33 @@ public class Agent implements PropertyChangeListener{
MessagePseudo msgPresentation = new MessagePseudo(this.localAddress, this.broadcast, this.user.getPort(), App.portDest, 1, this.user.getPseudo(), this.user.getId(), "");
BOut.send(msgPresentation, this.broadcast, App.portDest);
this.user.setStatut("En ligne");
//System.out.println("Connexion réussie avec le pseudo : "+pseudo);
}else {
System.out.println("Echec de la connexion, veuillez choisir un autre pseudo");
}
return pseudoOK;
}
//Connexion (une inscription a déjà eu lieu)
public boolean connectConnexion(String pseudo, String login) throws IOException, InterruptedException {
//Envoi d'un message de broadcast sans pseudo
MessagePseudo msg_connexion = new MessagePseudo(this.localAddress, this.broadcast, this.user.getPort(), App.portDest, 0, "", this.user.getId(), "");
BOut.send(msg_connexion, this.broadcast, App.portDest);
//Attente pour avoir le temps de recevoir les réponses des users actifs
Thread.sleep(2000);
//On gère toutes les réponses reçues après notre broadcast
ArrayList<MessagePseudo> msg_recus = BIn.getListMessage();
for(int i =0; i<msg_recus.size(); i++) {
handleMessage(msg_recus.get(i));
}
//Choix du pseudo
boolean pseudoOK = choisirPseudo(pseudo);
//list.addContact(user);
//Si le pseudo est acceptable :
//Envoi d'un message de broadcast avec le pseudo
if(pseudoOK){
Request.sendUser(pseudo, this.localAddress.toString(), Integer.toString(App.portSrc), "addUser");
int id = db.getIdFromLogin(login);
@ -230,19 +240,22 @@ public class Agent implements PropertyChangeListener{
BOut.send(msgPresentation, this.broadcast, App.portDest);
db.updateStatus(id, "En ligne");
this.user.setStatut("En ligne");
//System.out.println("Connexion réussie avec le pseudo : "+pseudo);
}else {
System.out.println("Echec de la connexion, veuillez choisir un autre pseudo");
}
return pseudoOK;
}
//Choix du pseudo
public boolean choisirPseudo(String pseudo) throws IOException {
//On demande au serveur si le pseudo peut être utilisé
boolean pseudoExist = Request.sendPseudo(pseudo, "pseudoOK");
if(pseudoExist){
//Le pseudo est OK on l'attribue au user
user.setPseudo(pseudo);
//System.out.println("Pseudo set : "+pseudo);
return true;
}else {
System.out.println("Pseudo déjà utilisé");
@ -250,35 +263,47 @@ public class Agent implements PropertyChangeListener{
}
}
//Déconnexion
public void deconnexion() throws IOException {
//On notifie le serveur de la deconnexion
Request.sendDeconnexion(Integer.toString(this.user.getId()),this.user.getPseudo(), "deconnexion");
//On envoie un message de deconnexion en broadcast
MessagePseudo msgDeconnexion = new MessagePseudo(this.localAddress, this.broadcast, App.portSrc, App.portDest, 2, this.user.getPseudo(), this.user.getId(), "");
BOut.send(msgDeconnexion, this.broadcast, App.portSrc);
//Fermeture socket
this.BIn.interrupt();
this.BOut.getSocket().close();
//this.server.getSocket().close();
this.server.interrupt();
//list.deleteContact(user);
System.exit(1);
}
//Changement du pseudo
public boolean changerPseudo(String pseudo) throws IOException {
String ancienPseudo = user.getPseudo();
//Vérification que le nouveau pseudo est acceptable
boolean changeOK = choisirPseudo(pseudo);
//Si le changement est acceptable :
//Changement du pseudo dans la base de donnée
//Notification du serveur du changement
//Envoi message de broadcast avec le nouveau pseudo
if(changeOK){
//System.out.println("Pseudo changé à : "+pseudo);
db.updatePseudo(this.user.getId(), pseudo);
//list.modifierListe(ancienPseudo, pseudo);
Request.sendPseudoChange(ancienPseudo, pseudo, "pseudoChanged");
MessagePseudo msgNewPseudo = new MessagePseudo(this.localAddress, this.broadcast, App.portSrc, App.portDest, 3, pseudo, this.user.getId(), ancienPseudo);
BOut.send(msgNewPseudo, this.broadcast, App.portSrc);
return true;
}else {
//System.out.println("Veuillez choisir un autre pseudo");
return false;
}
}
//Vérification que le chat en paramètre existe déjà ou non
public boolean chatExists(int destID) {
boolean chatExists = false;
for(TCPChat tcp : listTCPDeg) {
@ -289,23 +314,26 @@ public class Agent implements PropertyChangeListener{
return chatExists;
}
//Création d'un chat
public void createChat (int destId, String destPseudo) throws IOException {
//Vérification de l'existence du chat
boolean chatExists = chatExists(destId);
//Si le chat n'existe pas encore
if(!chatExists) {
//Vérification que le destinataire est bien dans la liste des user actifs
boolean isNotOnList = Request.sendPseudo(destPseudo, "pseudoOK");
//Si le destinataire est actif :
//Création d'un TCPChat
if(!isNotOnList) {
Contact dest = Request.getUser(destPseudo, "getUser");
TCPChat connexionTCP = new TCPChat(dest, destId);
listTCPDeg.add(connexionTCP);
connexionTCP.addPropertyChangeListener(this);
}
/*for(Contact user : list.getListe()) {
if(user.getPseudo().equals(destPseudo)) {
TCPChat connexionTCP = new TCPChat(user, destId);
listTCPDeg.add(connexionTCP);
connexionTCP.addPropertyChangeListener(this);
}
}*/
}
}
@ -318,42 +346,22 @@ public class Agent implements PropertyChangeListener{
this.support.removePropertyChangeListener(propertyName,pcl);
}
public Contact getUser() {
return user;
}
public void setUser(Contact user) {
this.user = user;
}
/*public ListeContacts getList() {
return list;
}
public void setList(ListeContacts list) {
this.list = list;
}*/
public DataBase getDb() {
return db;
}
public void setDb(DataBase db) {
this.db = db;
}
public ArrayList<TCPChat> getListeTCPChat(){
return listTCPDeg;
}

ファイルの表示

@ -24,7 +24,6 @@ public class DataBase {
}
try {
connexion = DriverManager.getConnection("jdbc:mysql://srv-bdens.insa-toulouse.fr:3306/tp_servlet_018?useSSL=false", "tp_servlet_018", "Taey2Aje");
//connexion = DriverManager.getConnection("jdbc:mysql://localhost/test?characterEncoding=utf8", "root","root");
}catch(SQLException e) {
e.printStackTrace();
}
@ -40,6 +39,7 @@ public class DataBase {
}
}
//Ajout d'un user
//retourne l'id associé au user ajouté
public int addUser(String pseudo, String login) {
String query = "INSERT INTO users (pseudo, statut, login) VALUES (?, ?, ?)";
@ -116,7 +116,6 @@ public class DataBase {
} catch (SQLException e) {
e.printStackTrace();
}
//System.out.println("loginAux = "+loginAux);
return !(loginAux==null);
}
@ -180,10 +179,11 @@ public class DataBase {
}
}
//chat table : nom : id1id2
//chat table :
//nom : idSrcidDest
//colonnes :
//id (l'id unique du message)
//id1 et id2 les id des deux users qui se parlent
//idSrc et idDest : les id des deux users qui se parlent
//message : le message envoyé
//date : la date d'envoi du msg
public void newChatTable (int id1, int id2) {
@ -232,7 +232,7 @@ public class DataBase {
return res;
}
//il faut mettre dans l'ordre idSrc pour id1 et id Dest pour id2 dans les params
//il faut mettre dans l'ordre idSrc pour id1 et id Dest pour id2 dans les params
public void addMessage(int id1, int id2, String message) {
int idSrc = id1;
int idDest = id2;

ファイルの表示

@ -8,7 +8,6 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.sql.SQLException;
@ -16,7 +15,6 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.*;
import javax.swing.border.Border;
@ -71,10 +69,11 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
this.frame = new JFrame("Fenetre Chat avec "+ userString);
this.agent = agent;
this.user = agent.getUser();
//this.dest = agent.getList().findContact(userString);
this.dest = Request.getUser(userString, "getUser");
InetAddress adr = dest.getAddress();
//Récupération du TCPChat associé au dest
for(TCPChat tcp : agent.getListeTCPChat()) {
if(tcp.getSocket().getInetAddress().equals(adr)) {
t=tcp;
@ -91,12 +90,6 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
public void windowClosing(WindowEvent e) {
int quitter = FenetreMenu.fenetreFermeture();
if(quitter == 0) {
/*try {
t.getSocket().close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/
frame.dispose();
}
}};
@ -105,7 +98,6 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
this.panel.setOpaque(false);
this.addWidgets();
//frame.getContentPane().add(panel, BorderLayout.CENTER);
afficherHistorique();
frame.getRootPane().setDefaultButton(envoyer);
@ -140,7 +132,7 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
this.frame.getContentPane().setLayout(gridBagLayout);
//zone pour rentrer les message à envoyer
//zone pour entrer les message à envoyer
text = new JTextArea(10, 3);
text.setForeground(Color.WHITE);
text.setBackground(Color.GRAY);
@ -188,13 +180,15 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
envoyer.addActionListener(new ActionListener() {
private Date date;
public void actionPerformed(ActionEvent e) {
//récupération du texte entré par le user
String message = text.getText();
//System.out.println("Message :"+ message);
//System.out.println(dest);
//récupération id user et dest
int idUser = agent.getDb().getIdFromPseudo(user.getPseudo());
//System.out.println("IDuser = "+idUser);
int idDest = agent.getDb().getIdFromPseudo(dest.getPseudo());
//System.out.println("IDdest = "+idDest);
//récupération du TCPChat associé au dest
try {
TCPChat tcpChat = null;
for(TCPChat tcp : agent.getListeTCPChat()) {
@ -204,16 +198,29 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
}
text.setText("");
//Création de la date du message
this.setDate(new Date());
DateFormat format = new SimpleDateFormat(" (yyyy/MM/dd HH:mm:ss)");
String dateString = format.format(this.date);
//Envoi du message
tcpChat.sendMsg(message);
//Affichage du message et de la date
doc.insertString(doc.getLength(), "\n"+message+dateString, right );
doc.setParagraphAttributes(doc.getLength(), 1, right, false);
text.setCaretPosition(text.getDocument().getLength());
//Si le chat entre user et dest existe déjà dans la base de donnée
if(agent.getDb().tableChatExists(idUser, idDest)) {
//ajout du message dans la table
agent.getDb().addMessage(idUser, idDest, message);
//Sinon
}else {
//Création de la table et ajout du message
agent.getDb().newChatTable(idUser, idDest);
agent.getDb().addMessage(idUser, idDest, message);
}
@ -270,17 +277,21 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
SimpleAttributeSet left = new SimpleAttributeSet();
StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT);
StyleConstants.setForeground(left, c.brighter());
int idUser = agent.getDb().getIdFromPseudo(user.getPseudo());
//System.out.println("IDuser = "+idUser);
int idDest = agent.getDb().getIdFromPseudo(dest.getPseudo());
if(agent.getDb().tableChatExists(idUser, idDest)) {
ArrayList<MessageAffichage> historic = null;
try {
historic = agent.getDb().getHistoric(idUser, idDest);
} catch (SQLException e2) {
e2.printStackTrace();
}
for(MessageAffichage msg : historic) {
if(msg.getId() == idUser) {
try {
doc.insertString(doc.getLength(), "\n"+msg.getMessage(), right );
@ -303,7 +314,6 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
public void propertyChange(PropertyChangeEvent evt) {
switch(evt.getPropertyName()){
case "deconnexion" :
System.out.println("Je suis dans deconnexion");
InetAddress adr = dest.getAddress();
TCPChat t=null;
for(TCPChat tcp : agent.getListeTCPChat()) {
@ -314,7 +324,6 @@ public class FenetreChat extends JFrame implements PropertyChangeListener{
try {
t.getSocket().close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
agent.getListeTCPChat().remove(t);

ファイルの表示

@ -41,7 +41,6 @@ public class FenetreConnexion implements ActionListener {
*/
public FenetreConnexion() {
try {
//here you can put the selected theme class name in JTattoo
UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
} catch (ClassNotFoundException ex) {
@ -53,15 +52,20 @@ public class FenetreConnexion implements ActionListener {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//creer une instance JFrame
frame = new JFrame("Fenetre connexion");
//sortir quand lutilisateur ferme le frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// fixer les dimensions de la fenetre
frame.setSize(new Dimension(120, 40));
//Creer le JPanel
panel = new JPanel(new GridLayout(4,1));
panel.setOpaque(false);
//Ajouter les elements
this.addWidgets();
try {
@ -74,12 +78,16 @@ public class FenetreConnexion implements ActionListener {
} catch (IOException e) {
throw new RuntimeException(e);
}
//Set the default button.
frame.getRootPane().setDefaultButton(Connexion);
//Ajouter le panel a la window
frame.getContentPane().add(panel, BorderLayout.CENTER);
//L'utilisateur ne pourra pas aggrandir la fenetre
this.frame.setResizable(false);
//Afficher la fenetre
frame.pack();
frame.setVisible(true);
@ -88,41 +96,51 @@ public class FenetreConnexion implements ActionListener {
private void addWidgets() {
// Créer Zone d'insertion de texte pour le pseudo
this.pseudofield = new JTextField(2);
// creation d'un label qui contiendra un txt au centre
this.Text = new JLabel("Type your login", SwingConstants.CENTER);
this.Text.setForeground(Color.white);
this.Text.setOpaque(false);
//Ajout d'un bouton Connexion
this.Connexion = new JButton("Connexion");
this.Cancel = new JButton("Cancel");
this.Connexion.addActionListener(this);
this.Cancel.addActionListener(this);
//On associe au bouton Connexion des actions a realiser
this.Connexion.addActionListener(this);
this.Connexion.setSelected(false);
// On ajouter les differents elements au panel
panel.add(pseudofield);
panel.add(Text);
panel.add(Connexion);
panel.add(Cancel);
//ajouter un effet de bord transparent au composant Jlabel
Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
}
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == Connexion){
// on recupere le texte entree dans la zone de saisie
// on recupere le texte entré dans la zone de saisie
String login = pseudofield.getText();
boolean loginExiste = false;
boolean loginEstActif = false;
//On vérifie si login existe déjà
try {
loginExiste = Request.sendLogin(login, "loginExiste");
} catch (IOException e1) {
System.out.println("Pb envoi requete au serveur");
e1.printStackTrace();
}
//On vérifie si le login est utilisé par un user actif
try {
loginEstActif = Request.sendLogin(login, "estActif");
} catch (IOException e1) {
@ -130,48 +148,63 @@ public class FenetreConnexion implements ActionListener {
e1.printStackTrace();
}
//Le login n'existe pas
if(!loginExiste) {
//Affichage d'un message d'erreur
if(!Connexion.isSelected()) {
JOptionPane.showMessageDialog(frame, "This login doesn't exist", "Error", JOptionPane.WARNING_MESSAGE) ;
Connexion.setSelected(true);
frame.dispose();
new FenetreConnexion();
}
//Le login est utilisé par un user actif
}else if(loginEstActif){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Affichage d'un message d'erreur
if(!Connexion.isSelected() && !FenetreMenu.ouvert) {
JOptionPane.showMessageDialog(frame, "This login is used by an active user", "Error", JOptionPane.WARNING_MESSAGE) ;
Connexion.setSelected(true);
frame.dispose();
new FenetreConnexion();
}
//Le login existe et n'est pas utilisé par un user actif
}else {
// On crée un objet de type ChatApp
Agent agent;
boolean connexion;
try {
//Création d'un agent
agent = new Agent(Tools.getAdress()[0], App.portSrc, App.portDest, login);
//Récupération du pseudo et tentative de connexion
String pseudo = agent.getDb().getPseudoFromLogin(login);
// on tente une connexion avec ce pseudo
connexion = agent.connectConnexion(pseudo, login);
// Dans les deux cas de figures (reussite ou echec) on affiche un pop-up pour expliquer la situation
if(connexion) {
// La connexion a reussi
JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo) ;
frame.dispose();
// on lance une nouvelle fenetre de type View_Menu
FenetreMenu fenetreCourante= new FenetreMenu(agent);
}
else {
}else {
// La connexion a echoue, il est possible de rentrer un nouveau pseudo
JOptionPane.showMessageDialog(frame, "Echec de Connexion , ce pseudo est deja pris !");
}
} catch (IOException e) {
System.out.println("Création thread impossible");
e.printStackTrace();
@ -188,15 +221,15 @@ public class FenetreConnexion implements ActionListener {
}
private static void createAndShowGUI() {
// Etre certain d'avoir une joli fenetre
// Etre certain d'avoir une jolie fenetre
JFrame.setDefaultLookAndFeelDecorated(true);
// On crée une fentre d'acceuil
// On crée une fenetre d'acceuil
FenetreConnexion fenetre = new FenetreConnexion();
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();

ファイルの表示

@ -10,7 +10,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
@ -22,8 +21,6 @@ import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.JOptionPane;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.io.File;
import java.io.IOException;
@ -45,8 +42,8 @@ public class FenetreInscription implements ActionListener {
* Cette fenetre sera munie d'un bouton de connexion et d'une zone de saisie de pseudo.
*/
public FenetreInscription() {
try {
//here you can put the selected theme class name in JTattoo
UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
} catch (ClassNotFoundException ex) {
@ -58,15 +55,20 @@ public class FenetreInscription implements ActionListener {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//creer une instance JFrame
frame = new JFrame("Fenetre inscription");
//sortir quand lutilisateur ferme le frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// fixer les dimensions de la fenetre
frame.setSize(new Dimension(40, 100));
//Creer le JPanel
panel = new JPanel(new GridLayout(7,1));
panel.setOpaque(false);
//Ajouter les elements
this.addWidgets();
try {
@ -80,19 +82,24 @@ public class FenetreInscription implements ActionListener {
throw new RuntimeException(e);
}
frame.getRootPane().setDefaultButton(inscription);
//Ajouter le panel a la window
frame.getContentPane().add(panel, BorderLayout.CENTER);
//L'utilisateur ne pourra pas aggrandir la fenetre
//L'utilisateur ne pourra pas agrandir la fenetre
this.frame.setResizable(false);
//Afficher la fenetre
frame.pack();
frame.setVisible(true);
}
private void addWidgets() {
// Créer Zone d'insertion de texte pour le pseudo
this.loginfield = new JTextField(2);
this.pseudofield = new JTextField(2);
// creation d'un label qui contiendra un txt au centre
this.Text = new JLabel("Forbidden characters: space, '?','&', '/', '=' ", SwingConstants.CENTER);
this.Text.setForeground(Color.WHITE);
@ -118,12 +125,15 @@ public class FenetreInscription implements ActionListener {
JLabel text2 = new JLabel("Pseudo: ", SwingConstants.CENTER);
text2.setForeground(Color.WHITE);
text2.setOpaque(false);
//Ajout d'un bouton Connexion
this.inscription = new JButton("Sign Up");
this.connexion = new JButton("Sign In");
//On associe au bouton Connexion des actions a realiser
this.inscription.addActionListener(this);
this.connexion.addActionListener(this);
// On ajouter les differents elements au panel
panel.add(text);
panel.add(loginfield);
@ -132,6 +142,7 @@ public class FenetreInscription implements ActionListener {
panel.add(Text);
panel.add(inscription);
panel.add(connexion);
//ajouter un effet de bord transparent au composant Jlabel
Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
}
@ -139,34 +150,48 @@ public class FenetreInscription implements ActionListener {
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == inscription) {
// on recupere le texte entree dans la zone de saisie
// on recupere le login et le pseudo entrés dans la zone de saisie
String login = loginfield.getText();
String pseudo = pseudofield.getText();
//Si le login ou le pseudo sont vides affichage message d'erreur
if(login.isBlank()||pseudo.isBlank()) {
JOptionPane.showMessageDialog(frame, "Please do not enter a blank pseudo or login") ;
//Si le login existe déjà on affiche un message d'erreur
}else if(DataBase.getInstance().loginExiste(login)){
JOptionPane.showMessageDialog(frame, "This login is already used");
//Les conditions sont réunies
}else {
// On crée un objet de type ChatApp
Agent agent;
boolean connexion;
try {
//Création d'un agent
agent = new Agent(Tools.getAdress()[0], App.portSrc, App.portDest);
// on tente une connexion avec ce pseudo
// on tente une connexion avec le pseudo
connexion = agent.connectInscription(pseudo, login);
// Dans les deux cas de figures (reussite ou echec) on affiche un pop-up pour expliquer la situation
if(connexion) {
// La connexion a reussi
JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo) ;
frame.dispose();
// on lance une nouvelle fenetre de type View_Menu
FenetreMenu fenetreCourante= new FenetreMenu(agent);
}
else {
}else {
// La connexion a echoue, il est possible de rentrer un nouveau pseudo
JOptionPane.showMessageDialog(frame, "Echec de Connexion , ce pseudo est deja pris !");
}
} catch (IOException e) {
System.out.println("Création thread impossible");
e.printStackTrace();
@ -175,6 +200,7 @@ public class FenetreInscription implements ActionListener {
e.printStackTrace();
}
}
}else if(source == connexion){
frame.dispose();
FenetreConnexion fenetreCo = new FenetreConnexion();
@ -183,15 +209,16 @@ public class FenetreInscription implements ActionListener {
public static void createAndShowGUI() {
// Etre certain d'avoir une joli fenetre
JFrame.setDefaultLookAndFeelDecorated(true);
// On crée une fentre d'acceuil
FenetreInscription fenetre = new FenetreInscription();
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();

ファイルの表示

@ -7,8 +7,6 @@ import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Insets;
import java.awt.SystemColor;
@ -16,13 +14,11 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
@ -33,15 +29,14 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import controller.Agent;
import model.Contact;
import server.Request;
public class FenetreMenu {
JFrame frame;
JPanel panel;
JMenuBar menu;
@ -59,7 +54,6 @@ public class FenetreMenu {
FenetreMenu.ouvert=true;
this.agent = agent;
try {
//here you can put the selected theme class name in JTattoo
UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
} catch (ClassNotFoundException ex) {
@ -71,6 +65,7 @@ public class FenetreMenu {
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FenetreMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
frame = new JFrame("Fenêtre menu");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
@ -95,10 +90,12 @@ public class FenetreMenu {
frame.addWindowListener(wa);
menu = new JMenuBar();
//Creation d'un JPanel
panel = new JPanel(new GridBagLayout());
panel.setForeground(SystemColor.menuText);
panel.setOpaque(false);
// Ajouter tout les elements a la fenetre
this.addWidgets();
@ -112,8 +109,10 @@ public class FenetreMenu {
} catch (IOException e) {
throw new RuntimeException(e);
}
// ajouter le panel a la fenetre
frame.getContentPane().add(panel, BorderLayout.CENTER);
// Afficher la fenetre
frame.pack();
frame.setVisible(true);
@ -128,6 +127,7 @@ public class FenetreMenu {
}
private void addWidgets() throws IOException {
jlabel = new JLabel(new ImageIcon("panda.png"), JLabel.CENTER);
jlabel.setOpaque(false);
texte = new JLabel();
@ -148,7 +148,6 @@ public class FenetreMenu {
contenu.setBackground(c.darker());
contenu.setHorizontalAlignment(SwingConstants.CENTER);
//JMenuItem usersActifs = new JMenuItem("Active users");
JMenuItem modifierPseudo = new JMenuItem("Modify your pseudo");
modifierPseudo.setBackground(c.darker());
modifierPseudo.setForeground(Color.WHITE);
@ -156,7 +155,6 @@ public class FenetreMenu {
deco.setBackground(c.darker());
deco.setForeground(Color.WHITE);
//contenu.add(usersActifs);
contenu.add(modifierPseudo);
contenu.add(deco);
@ -172,7 +170,6 @@ public class FenetreMenu {
String users = Request.actifs("actifs");
String users2 = users.replaceAll("\\s", "\n");
//String users = agent.getList().actifUsers();
Vector<String> v = new Vector<String>();
for(String pseudo : users2.split("\n")) {
v.add(pseudo);
@ -251,7 +248,6 @@ public class FenetreMenu {
}
}
});
//panel.add(BorderLayout.NORTH, menu);

ファイルの表示

@ -21,6 +21,7 @@ import java.io.IOException;
import controller.*;
public class FenetreModifPseudo implements ActionListener {
JFrame frame;
JPanel panel;
JTextField pseudofield;
@ -34,45 +35,61 @@ public class FenetreModifPseudo implements ActionListener {
* Cette fenetre sera munie d'un bouton de connexion et d'une zone de saisie de pseudo.
*/
public FenetreModifPseudo(Agent agent) {
this.agent = agent;
//creer une instance JFrame
frame = new JFrame("Modification pseudo");
//sortir quand lutilisateur ferme le frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// fixer les dimensions de la fenetre
frame.setSize(new Dimension(120, 40));
//Creer le JPanel
panel = new JPanel(new GridLayout(4,1));
//Ajouter les elements
this.addWidgets();
//Set the default button.
frame.getRootPane().setDefaultButton(ok);
//Ajouter le panel a la window
frame.getContentPane().add(panel, BorderLayout.CENTER);
//L'utilisateur ne pourra pas aggrandir la fenetre
this.frame.setResizable(false);
//Afficher la fenetre
frame.pack();
frame.setVisible(true);
}
private void addWidgets() {
// Créer Zone d'insertion de texte pour le pseudo
this.pseudofield = new JTextField(2);
// creation d'un label qui contiendra un txt au centre
this.Text = new JLabel("Type your new pseudo", SwingConstants.CENTER);
//Ajout d'un bouton Connexion
this.ok = new JButton("Continue");
this.Cancel = new JButton("Cancel");
this.ok.addActionListener(this);
this.Cancel.addActionListener(this);
//On associe au bouton Connexion des actions a realiser
this.ok.addActionListener(this);
// On ajouter les differents elements au panel
// On ajoute les differents elements au panel
panel.add(pseudofield);
panel.add(Text);
panel.add(ok);
panel.add(Cancel);
//ajouter un effet de bord transparent au composant Jlabel
Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
}
@ -80,20 +97,30 @@ public class FenetreModifPseudo implements ActionListener {
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source == ok){
//Récupération du nouveau pseudo
String newPseudo = pseudofield.getText();
try {
//Si le nouveau pseudo est acceptable
if(agent.changerPseudo(newPseudo)) {
//Affichage message
JOptionPane.showMessageDialog(frame, "Your new pseudo is "+newPseudo);
frame.dispose();
new FenetreMenu(agent);
//Sinon affichage message erreur
}else {
JOptionPane.showMessageDialog(frame, "Pseudo already use, choose another one");
}
} catch (HeadlessException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
};
}else if(source == Cancel) {
frame.dispose();
try {

ファイルの表示

@ -1,6 +1,5 @@
package model;
import java.io.*;
import java.net.InetAddress;
public class Contact {

ファイルの表示

@ -1,16 +1,12 @@
package model;
import network.*;
import java.net.InetAddress;
import java.util.ArrayList;
public class ListeContacts {
private static Contact user;
private ArrayList<Contact> listeContact;
//la liste doit être un singleton
private static final ListeContacts instance = new ListeContacts();
public ListeContacts() {
@ -21,10 +17,6 @@ public class ListeContacts {
return instance;
}
public static void createUser(String pseudo, int port) {
user = new Contact(pseudo, Tools.getLocalIp(), port);
}
public boolean contactExist(Contact contact) {
for(Contact c : listeContact) {
if(c.getPseudo().equals(contact.getPseudo())){

ファイルの表示

@ -5,6 +5,8 @@ import java.net.*;
public class Message implements Serializable{
private static final long serialVersionUID = 1L;
protected InetAddress addressSrc;
protected InetAddress addressDest;
protected int portSrc;

ファイルの表示

@ -7,6 +7,8 @@ import java.util.Date;
public class MessageChat extends Message{
private static final long serialVersionUID = 1L;
private String message;
private Date date;

ファイルの表示

@ -4,6 +4,8 @@ import java.net.InetAddress;
public class MessagePseudo extends Message{
private static final long serialVersionUID = 1L;
private String pseudo;
private int id;
private String ancienPseudo;

ファイルの表示

@ -10,7 +10,6 @@ import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import controller.Agent;
import model.Contact;
import model.MessageChat;
@ -56,23 +55,20 @@ public class TCPChat extends Thread{
public void run() {
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
while(true) {
try {
String input = in.readLine();
MessageChat msgRecu = new MessageChat(this.socket.getInetAddress(), this.socket.getLocalAddress(), this.socket.getPort(), this.socket.getLocalPort(), 0, input);
listeMessagesRecu.add(msgRecu);
//System.out.println("fire msg tcp recu");
this.support.firePropertyChange("Msg TCP Recu", true, false);
//if (!msgRecu.getMessage().equals(null)) {
//System.out.println("Message reçu : "+msgRecu.getMessage() );
//}
} catch (IOException e) {
this.support.firePropertyChange("deconnexion",true,false);
System.out.println("Création et read du in impossible");
break;
//e.printStackTrace();
}
}
@ -85,7 +81,6 @@ public class TCPChat extends Thread{
public void sendMsg(String message) throws IOException {
PrintWriter out = new PrintWriter(this.socket.getOutputStream(),true);
out.println(message);
//System.out.println("Message envoyé : "+message);
}

ファイルの表示

@ -1,6 +1,5 @@
package network;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
@ -18,9 +17,9 @@ public class TCPServer extends Thread{
private PropertyChangeSupport support;
public TCPServer(int port, InetAddress address) throws IOException {
this.port = port;
this.socket = new ServerSocket(port, 1000, address);
this.address = address;
this.port = port;
this.listeConnexions = new ArrayList<TCPChat>();
this.support = new PropertyChangeSupport(this);
this.start();
@ -39,7 +38,6 @@ public class TCPServer extends Thread{
TCPChat tcpChat = new TCPChat(link);
this.listeConnexions.add(tcpChat);
this.support.firePropertyChange("session chat demarree", true, false);
//link.close();// A APPELER QUELQUE PART D'AUTRE
} catch (IOException e) {
System.out.println("Socket non créé ou non fermé");
e.printStackTrace();

ファイルの表示

@ -1,4 +1,5 @@
package network;
import java.net.*;
import java.util.Enumeration;
@ -18,7 +19,9 @@ public class Tools {
}
//Renvoie un tableau d'InetAdress le premier élement est l'adresse locale de la machine le deuxieme l'adresse de broadcast
//Renvoie un tableau d'InetAdress
//le premier élement est l'adresse locale de la machine
//le deuxieme l'adresse de broadcast
public static InetAddress[] getAdress() {
Enumeration<NetworkInterface> interfaces = null;
InetAddress localAdress = null;

ファイルの表示

@ -12,6 +12,7 @@ import java.util.ArrayList;
public class UDPInput extends Thread{
private DatagramSocket socket;
private ArrayList<MessagePseudo> messageReceived;
private PropertyChangeSupport support;
@ -48,19 +49,14 @@ public class UDPInput extends Thread{
System.out.println("Packet UDP non reçu\n");
e.printStackTrace();
}
/* Charset charset = StandardCharsets.US_ASCII;
String pseudo = charset.decode(ByteBuffer.wrap(inPacket.getData())).toString();
MessagePseudo msg = new MessagePseudo(null, null, 0, 0, 0, "");
msg.setPseudo(pseudo);*/
ByteArrayInputStream byteInStream = new ByteArrayInputStream(inPacket.getData());
ObjectInputStream objectInStream;
try {
objectInStream = new ObjectInputStream(byteInStream);
MessagePseudo msg = (MessagePseudo) objectInStream.readObject();
messageReceived.add(msg);
System.out.println("fire property change");
this.support.firePropertyChange("Msg UDP Recu", this.messageReceived.size() -1, this.messageReceived.size());
System.out.println("Message reçu, pseudo = "+msg.getPseudo()+" et num port = "+msg.getPortSrc()+"\n");
} catch (IOException e) {
System.out.println("Objet pas créé");
e.printStackTrace();

ファイルの表示

@ -1,4 +1,5 @@
package network;
import model.*;
import java.io.ByteArrayOutputStream;
@ -6,10 +7,8 @@ import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.*;
public class UDPOutput {
private Contact user;
private DatagramSocket socket;
private int port;
@ -23,6 +22,7 @@ public class UDPOutput {
public void send(MessagePseudo msg, InetAddress addressDest, int portSrc) throws IOException {
byte[] buffer = "".getBytes();
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutStream = new ObjectOutputStream(byteOutStream);
@ -31,24 +31,12 @@ public class UDPOutput {
buffer = byteOutStream.toByteArray();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length,msg.getAddressDest(), msg.getPortDest());
this.socket.send(packet);
System.out.println("Message envoyé, pseudo = "+msg.getPseudo()+" et num port destination = "+portSrc+"\n");
}
public DatagramSocket getSocket() {
return this.socket;
}
/*public void send(MessageChangePseudo msg, InetAddress addressDest, int portSrc) throws IOException {
byte[] buffer = "".getBytes();
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutStream = new ObjectOutputStream(byteOutStream);
objectOutStream.writeObject(msg);
objectOutStream.close();
buffer = byteOutStream.toByteArray();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length,msg.getAddressDest(),msg.getPortDest());
this.socket.send(packet);
System.out.println("Message envoyé, pseudo = "+msg.getPseudo()+" et num port destination = "+portSrc+"\n");
}*/
}