Compare commits

..

8 commits

Author SHA1 Message Date
fdea8b4c30 Merge branch Nabil 2020-12-14 12:56:05 +01:00
Nabzzz
2eb1862b9c TCP fini Historique KO 2020-12-14 12:47:04 +01:00
Nabzzz
9010fe3f23 Phase de debug sur la synchro de l'historique 2020-12-11 19:28:40 +01:00
af0f76c780 Phase de test TCP 2020-12-10 18:13:31 +01:00
a8e9a1876d Phase de test TCP 2020-12-10 17:59:19 +01:00
cc2a9cb729 Phase de test TCP 2020-12-10 17:37:28 +01:00
41be85aebe Phase de Test sur l'historique 2020-12-09 12:04:37 +01:00
616067cd20 Phase test TCP envoi OK historique KO 2020-12-09 09:52:33 +01:00
12 changed files with 165 additions and 83 deletions

Binary file not shown.

View file

@ -27,6 +27,7 @@ public class ChatApp {
/* Map on l'on stocke localement les historiques des messages */ /* Map on l'on stocke localement les historiques des messages */
private Map<String,Historique> mapHistorique ; 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;
@ -53,11 +54,28 @@ public class ChatApp {
* @param pseudo Pseudo de l'utilisateur * @param pseudo Pseudo de l'utilisateur
* @param h nouvel Historique entre les deux utilisateurs * @param h nouvel Historique entre les deux utilisateurs
*/ */
public void majHistorique(String pseudo,Historique h) { public synchronized void majHistorique(Historique h) {
getMapHistorique().put(h.getUser2().getPseudo(),h); getMapHistorique().put(h.getUser2().getPseudo(),h);
} }
/*public void majHistorique2(MessageHorodate mh, String pseudo) {
Historique h = getMapHistorique().get(pseudo);
//h.addMessage(mh);
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
@ -165,7 +183,7 @@ public class ChatApp {
* @param pseudo Pseudo de l'utilisateur dont on souhaite obtenir l'historique * @param pseudo Pseudo de l'utilisateur dont on souhaite obtenir l'historique
* @return Un historique * @return Un historique
*/ */
public Historique getHist(String pseudo) { public synchronized Historique getHist(String pseudo) {
Historique h = this.mapHistorique.get(pseudo); Historique h = this.mapHistorique.get(pseudo);
if( h != null) { if( h != null) {
return h ; return h ;
@ -207,6 +225,14 @@ public class ChatApp {
} }
public boolean isHistoriqueAvailable() {
return historiqueAvailable;
}
public void setHistoriqueAvailable(boolean historiqueAvailable) {
this.historiqueAvailable = historiqueAvailable;
}
} }
class RunnerEcouteUDP implements Runnable { class RunnerEcouteUDP implements Runnable {

Binary file not shown.

View file

@ -53,7 +53,7 @@ public class Historique {
n = HistoriqueHorodate.size(); n = HistoriqueHorodate.size();
} }
for(int i = 0; i<n;i++) { for(int i = 0; i<n;i++) {
String exp = HistoriqueHorodate.get(i).getSource().toString(); String exp = HistoriqueHorodate.get(i).getSource().getPseudo();
String payload = HistoriqueHorodate.get(i).getMessage(); String payload = HistoriqueHorodate.get(i).getMessage();
System.out.println(exp+" : "+payload); System.out.println(exp+" : "+payload);
} }

View file

@ -27,12 +27,12 @@ public class MessageHorodate {
this.setDestinataire(destinataire) ; this.setDestinataire(destinataire) ;
this.setSource(source) ; this.setSource(source) ;
this.setMessage(Message) ; this.setMessage(Message) ;
this.dateHorodatage = new Date(); this.setDateHorodatage(new Date());
this.type = type; this.type = type;
} }
public void setDate(Date d) { public void setDate(Date d) {
this.dateHorodatage=d; this.setDateHorodatage(d);
} }
/** /**
@ -44,11 +44,11 @@ public class MessageHorodate {
@Override @Override
public String toString() { public String toString() {
String Msg = ""; String Msg = "";
Msg += ("Destinataire:" + this.getDestinataire() + "\n") ; Msg += ("Destinataire::" + this.getDestinataire() + "\n") ;
Msg += ("Source:" + this.getSource()+ "\n") ; Msg += ("Source::" + this.getSource()+ "\n") ;
Msg += ("Type:"+ this.type+ "\n"); Msg += ("Type::"+ this.type+ "\n");
Msg += ("Date:" + this.dateToString() + "\n") ; Msg += ("Date::" + this.dateToString() + "\n") ;
Msg += ("Message:" + this.getMessage() + "\n" ); Msg += ("Message::" + this.getMessage() + "\n" );
return Msg ; return Msg ;
} }
@ -60,7 +60,7 @@ public class MessageHorodate {
*/ */
public String dateToString() { public String dateToString() {
DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
return format.format(this.dateHorodatage); return format.format(this.getDateHorodatage());
} }
@ -73,23 +73,26 @@ public class MessageHorodate {
public static MessageHorodate stringToMessageHorodate(String s) { public static MessageHorodate stringToMessageHorodate(String s) {
String mots[] = s.split("\n"); String mots[] = s.split("\n");
Utilisateur destinataire = Utilisateur.stringToUtilisateur(mots[0].split(":")[1]); Utilisateur destinataire = Utilisateur.stringToUtilisateur(mots[0].split("::")[1]);
Utilisateur source = Utilisateur.stringToUtilisateur(mots[1].split(":")[1]); Utilisateur source = Utilisateur.stringToUtilisateur(mots[1].split("::")[1]);
int type = Integer.parseInt(mots[2].split(":")[1]); int type = Integer.parseInt(mots[2].split("::")[1]);
DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date(); Date date = new Date();
try { /*try {
date = format.parse(mots[3].split(":")[1]); date = format.parse(mots[3].split("::")[1]);
} catch (ParseException e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }*/
String payload = ""; String payload = "";
for(int i=4; i< mots.length; i++) { for(int i=4; i< mots.length; i++) {
if(mots[i].startsWith("Message::")) {
mots[i]=mots[i].split("::")[1];
}
payload += mots[i]+"\n"; payload += mots[i]+"\n";
} }
MessageHorodate mh = new MessageHorodate(destinataire, source, payload, type); MessageHorodate mh = new MessageHorodate(destinataire, source, payload, type);
mh.setDate(date); //mh.setDate(date);
return mh ; return mh ;
} }
@ -126,4 +129,12 @@ public class MessageHorodate {
this.type = type; this.type = type;
} }
public Date getDateHorodatage() {
return dateHorodatage;
}
public void setDateHorodatage(Date dateHorodatage) {
this.dateHorodatage = dateHorodatage;
}
} }

Binary file not shown.

View file

@ -6,6 +6,7 @@ import java.net.DatagramSocket;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.net.SocketException; import java.net.SocketException;
import java.util.NoSuchElementException;
import java.util.Scanner; import java.util.Scanner;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -19,12 +20,12 @@ import java.io.InputStreamReader;
* </p> * </p>
*/ */
public class TCPEchange { public class TCPEchange {
/** /**
* <p> * <p>
* Equivalent a un handshake. * Equivalent a un handshake.
* L'utilisateur associé a app souhaite entamé une discussion avec User2 * L'utilisateur associé a app souhaite entamé une discussion avec User2
* @param app L'app associé à l'utilisateur qui souhaite entamé la discussion * @param app L'app associé à l'utilisateur qui souhaite entamé la discussion
* @param User2 Le destinataire * @param User2 Le destinataire
* </p> * </p>
*/ */
@ -32,25 +33,33 @@ public class TCPEchange {
System.out.println("Demmarrage d'une session de clavardage"); System.out.println("Demmarrage d'une session de clavardage");
Socket s = new Socket(User2.getIp(),5000); Socket s = new Socket(User2.getIp(),5000);
System.out.println("Socket de demarrage d'une session cree"); System.out.println("Socket de demarrage d'une session cree");
ExecutorService exec = Executors.newFixedThreadPool(1000); //ExecutorService exec = Executors.newFixedThreadPool(1000);
// On lance un thread d'ecoute pour recevoir les messages de USER2 Thread t1 = new Thread(new RunnerTCPEcoute(s,app));
exec.submit(new RunnerTCPEcoute(s,app)); Thread t2 = new Thread(new RunnerTCPEnvoi(s,app,User2,false));
// On lance un thread d'envoi pour continuer d'envoyer des messages avec USER2 t1.start();
exec.submit(new RunnerTCPEnvoi(s,app,User2,false)); 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 ) { /*public static void envoiTCP(ChatApp app,Utilisateur User2, String Msg, int type ) {
// On cree un messagehorodate // On cree un messagehorodate
MessageHorodate mh = new MessageHorodate(app.getMe(), User2, Msg, type); MessageHorodate mh = new MessageHorodate(app.getMe(), User2, Msg, type);
if( type == 1 ) { if( type == 1 ) {
// on ajoute le msg à son historique // on ajoute le msg à son historique
Historique h = app.getHist(User2.getPseudo()); Historique h = app.getHist(User2.getPseudo());
h.addMessage(mh); h.addMessage(mh);
// on update la liste des historiques de app // on update la liste des historiques de app
app.majHistorique(User2.getPseudo(), h); app.majHistorique(h);
} }
try { try {
Socket s = new Socket(User2.getIp(), User2.getPort()); Socket s = new Socket(User2.getIp(), User2.getPort());
PrintStream output = new PrintStream(s.getOutputStream()); PrintStream output = new PrintStream(s.getOutputStream());
@ -61,8 +70,8 @@ public class TCPEchange {
e.printStackTrace(); e.printStackTrace();
} }
}*/ }*/
/** /**
* <p> * <p>
* Méthode pour qu'un objet de la classe ChatApp soit constamment en écoute de potentielles connexions * Méthode pour qu'un objet de la classe ChatApp soit constamment en écoute de potentielles connexions
@ -76,13 +85,13 @@ public class TCPEchange {
try { try {
ss = new ServerSocket(5000); // On ecoute sur le port 5000 ss = new ServerSocket(5000); // On ecoute sur le port 5000
System.out.println("Socket d'ecoute cree"); System.out.println("Socket d'ecoute cree");
while(true) { // Ecoute en boucle while(true) { // Ecoute en boucle
System.out.println("Attente Session de clavardage"); System.out.println("Attente Session de clavardage");
Socket link = ss.accept(); // Blocante Socket link = ss.accept(); // Blocante
exec.submit(new RunnerTCPEcoute(link,app)); // On crée un thread qui va gerer la connexion recu 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"); System.out.println("L'ecoute TCP continue apres le premier thread demarre");
} }
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -92,7 +101,7 @@ public class TCPEchange {
/** /**
* <p> * <p>
* Classe representant les threads s'occupant de l'envoie de messages en utilisant le protocole TCP. * Classe representant les threads s'occupant de l'envoie de messages en utilisant le protocole TCP.
* Cette classe implemente l'interface Runnable. * Cette classe implemente l'interface Runnable.
* </p> * </p>
*/ */
@ -108,7 +117,7 @@ class RunnerTCPEnvoi implements Runnable {
/** /**
* <p> * <p>
* Constructeur de la classe RunnerTCPEnvoi * Constructeur de la classe RunnerTCPEnvoi
* @param link * @param link
* @param app Un objet ChatApp dont l'utilisateur associé souhaite entame une discussion * @param app Un objet ChatApp dont l'utilisateur associé souhaite entame une discussion
* @param user2 Destinataire * @param user2 Destinataire
* @param bonjour Boolean true si c'est le debut d'une connexion, false sinon * @param bonjour Boolean true si c'est le debut d'une connexion, false sinon
@ -120,14 +129,14 @@ class RunnerTCPEnvoi implements Runnable {
this.Destinataire = user2; this.Destinataire = user2;
this.out = new PrintWriter(link.getOutputStream()); this.out = new PrintWriter(link.getOutputStream());
this.in = new BufferedReader (new InputStreamReader (link.getInputStream())); this.in = new BufferedReader (new InputStreamReader (link.getInputStream()));
this.bonjourEnvoye = bonjour; this.bonjourEnvoye = bonjour;
} }
@Override @Override
public void run() { public void run() {
System.out.println("Creation d'un thread d'envoi"); System.out.println("Creation d'un thread d'envoi");
String msg; String msg;
while(true){ while(true){
if(!bonjourEnvoye) { // bonjourEnvoye est a false si c'est le debut d'une communication if(!bonjourEnvoye) { // bonjourEnvoye est a false si c'est le debut d'une communication
MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),"Bonjour",2); MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),"Bonjour",2);
@ -136,16 +145,36 @@ class RunnerTCPEnvoi implements Runnable {
out.println(mh); out.println(mh);
out.flush(); out.flush();
} }
else { // Nous sommes dans le cas ou la connexion a deja ete etablie else {
try {
msg = sc.nextLine(); msg = sc.nextLine();
}catch(NoSuchElementException e) {
break;
}
MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),msg,1); MessageHorodate mh = new MessageHorodate(Destinataire,app.getMe(),msg,1);
if(msg.equals("--STOP--")) { if(msg.equals("--STOP--")) {
mh = new MessageHorodate(Destinataire,app.getMe(),msg,0); mh = new MessageHorodate(Destinataire,app.getMe(),msg,0); // ENVOYER JUSTE --STOP-- SUFFIT
out.println(mh); out.println(mh);
out.flush(); out.flush();
break; break;
} }
out.println(mh); // Envoi du message /* 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"); System.out.println("Envoi d'un mesage");
out.flush(); out.flush();
} }
@ -158,13 +187,14 @@ class RunnerTCPEnvoi implements Runnable {
// Gestion de l'exception de la fermeture de la socket // Gestion de l'exception de la fermeture de la socket
} }
} }
} }
/** /**
* <p> * <p>
* Classe representant les threads s'occupant de la reception de messages en utilisant le protocole TCP. * Classe representant les threads s'occupant de la reception de messages en utilisant le protocole TCP.
* Cette classe implemente l'interface Runnable. * Cette classe implemente l'interface Runnable.
* </p> * </p>
*/ */
@ -172,17 +202,11 @@ class RunnerTCPEcoute implements Runnable {
final Socket link; final Socket link;
private ChatApp app ; private ChatApp app ;
private Utilisateur u2; private Utilisateur u2;
private boolean u2Initialise;
/**
* <p>
* Constructeur de la classe RunnerTCPEnvoi
* @param link
* @param app Un objet ChatApp dont l'utilisateur associé souhaite entame une discussion
* </p>
*/
public RunnerTCPEcoute(Socket link,ChatApp app ) { public RunnerTCPEcoute(Socket link,ChatApp app ) {
this.link = link; // fait le lien entre l'utilisateur associé a app et un autre utilisateur this.link = link;
this.app = app; // Source this.app = app;
this.u2Initialise=false;
} }
@Override @Override
@ -192,7 +216,7 @@ class RunnerTCPEcoute implements Runnable {
PrintStream output = new PrintStream(link.getOutputStream()); PrintStream output = new PrintStream(link.getOutputStream());
//InputStream is = link.getInputStream(); //InputStream is = link.getInputStream();
BufferedReader in = new BufferedReader (new InputStreamReader (link.getInputStream())); BufferedReader in = new BufferedReader (new InputStreamReader (link.getInputStream()));
String line = ""; String line = "";
String dest = ""; String dest = "";
String src = ""; String src = "";
@ -200,57 +224,80 @@ class RunnerTCPEcoute implements Runnable {
String date = ""; String date = "";
String payload = ""; String payload = "";
String msg = ""; String msg = "";
line = in.readLine();
while (line != null) { while (line != null) {
line = in.readLine();
if(line.split("::")[0].equals("Destinataire")) {
if(line.split(":")[0].equals("Destinataire")) {
if(msg.equals("")) { if(msg.equals("")) {
dest = line+"\n"; dest = line+"\n";
msg=".";
} }
else { else {
msg=dest+src+type+date+payload; msg=dest+src+type+date+payload;
payload = ""; payload = "";
MessageHorodate mh = MessageHorodate.stringToMessageHorodate(msg); MessageHorodate mh = MessageHorodate.stringToMessageHorodate(msg);
System.out.println("Type du message:"+mh.getType());
if(mh.getType()==1) { 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()); Historique h = app.getHist(mh.getSource().getPseudo());
h.addMessage(mh); h.addMessage(mh);
app.majHistorique(h);
app.majHistorique(mh.getSource().getPseudo(), h); //app.setHistoriqueAvailable(true);
//notifyAll();
//app.majHistorique2(mh,mh.getSource().getPseudo());
} }
else if(mh.getType()==0) { else if(mh.getType()==0) {
break; break;
} }
} }
} }
else if(line.split(":")[0].equals("Source")) { else if(line.split("::")[0].equals("Source")) {
src = line+"\n"; 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")) { else if(line.split("::")[0].equals("Type")) {
if(line.split(":")[1].equals("2")) { if(line.split("::")[1].equals("2")) {
System.out.println("Bonjour recu!"); System.out.println("Bonjour recu!");
//System.out.println(src.split(":")[1].replaceAll("\n", "")); //System.out.println(src.split("::")[1].replaceAll("\n", ""));
u2=Utilisateur.stringToUtilisateur(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)); Thread t = new Thread(new RunnerTCPEnvoi(link,app,u2,true));
t.start(); t.start();
System.out.println("Thread d'envoi envoye"); System.out.println("Thread d'envoi envoye");
} }
type = line+"\n"; type = line+"\n";
} }
else if(line.split(":")[0].equals("Date")) { else if(line.split("::")[0].equals("Date")) {
date = line+"\n"; date = line+"\n";
} }
else if(line.split("::")[0].equals("Message")){
payload = line+"\n";
}
else { else {
payload += line+"\n"; payload += line+"\n";
} }
System.out.println("Received: "+ line); 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(); in.close();
link.close(); link.close();
} catch (IOException e) { } catch (IOException e) {
@ -258,13 +305,11 @@ class RunnerTCPEcoute implements Runnable {
} finally { } finally {
System.out.println("Finishing thread"); System.out.println("Finishing thread");
System.out.println("Affichage de l'histo"); System.out.println("Affichage de l'histo");
app.getHist(u2.getPseudo()).afficher10derniers(); System.out.println("Pseudo du poto: >>"+u2.getPseudo()+"<<");
app.getHist(u2.getPseudo()).afficher10derniers();
} }
} }
} }