Echange de messages ok entre deux PCs
This commit is contained in:
commit
ed4f39a6a0
61 changed files with 1806 additions and 0 deletions
15
chat/.classpath
Normal file
15
chat/.classpath
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="lib" path="lib/mysql-connector-java-5.0.5-bin.jar">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
17
chat/.project
Normal file
17
chat/.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>chat</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
15
chat/.settings/org.eclipse.jdt.core.prefs
Normal file
15
chat/.settings/org.eclipse.jdt.core.prefs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=13
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=13
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||||
|
org.eclipse.jdt.core.compiler.release=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.source=13
|
BIN
chat/bin/controller/Agent.class
Normal file
BIN
chat/bin/controller/Agent.class
Normal file
Binary file not shown.
BIN
chat/bin/controller/DataBase.class
Normal file
BIN
chat/bin/controller/DataBase.class
Normal file
Binary file not shown.
BIN
chat/bin/controller/Test.class
Normal file
BIN
chat/bin/controller/Test.class
Normal file
Binary file not shown.
BIN
chat/bin/controller/package-info.class
Normal file
BIN
chat/bin/controller/package-info.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreAcc$1.class
Normal file
BIN
chat/bin/gui/FenetreAcc$1.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreAcc.class
Normal file
BIN
chat/bin/gui/FenetreAcc.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreChat$1.class
Normal file
BIN
chat/bin/gui/FenetreChat$1.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreChat$2.class
Normal file
BIN
chat/bin/gui/FenetreChat$2.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreChat.class
Normal file
BIN
chat/bin/gui/FenetreChat.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$1.class
Normal file
BIN
chat/bin/gui/FenetreMenu$1.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$2.class
Normal file
BIN
chat/bin/gui/FenetreMenu$2.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$3$1.class
Normal file
BIN
chat/bin/gui/FenetreMenu$3$1.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$3.class
Normal file
BIN
chat/bin/gui/FenetreMenu$3.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$4$1.class
Normal file
BIN
chat/bin/gui/FenetreMenu$4$1.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$4$2.class
Normal file
BIN
chat/bin/gui/FenetreMenu$4$2.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$4.class
Normal file
BIN
chat/bin/gui/FenetreMenu$4.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu$5.class
Normal file
BIN
chat/bin/gui/FenetreMenu$5.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/FenetreMenu.class
Normal file
BIN
chat/bin/gui/FenetreMenu.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/package-info.class
Normal file
BIN
chat/bin/gui/package-info.class
Normal file
Binary file not shown.
BIN
chat/bin/gui/panda.png
Normal file
BIN
chat/bin/gui/panda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
chat/bin/images/panda.png
Normal file
BIN
chat/bin/images/panda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
chat/bin/model/Contact.class
Normal file
BIN
chat/bin/model/Contact.class
Normal file
Binary file not shown.
BIN
chat/bin/model/ListeContacts.class
Normal file
BIN
chat/bin/model/ListeContacts.class
Normal file
Binary file not shown.
BIN
chat/bin/model/Message.class
Normal file
BIN
chat/bin/model/Message.class
Normal file
Binary file not shown.
BIN
chat/bin/model/MessageChat.class
Normal file
BIN
chat/bin/model/MessageChat.class
Normal file
Binary file not shown.
BIN
chat/bin/model/MessageDeconnexion.class
Normal file
BIN
chat/bin/model/MessageDeconnexion.class
Normal file
Binary file not shown.
BIN
chat/bin/model/MessagePseudo.class
Normal file
BIN
chat/bin/model/MessagePseudo.class
Normal file
Binary file not shown.
BIN
chat/bin/module-info.class
Normal file
BIN
chat/bin/module-info.class
Normal file
Binary file not shown.
BIN
chat/bin/network/Manager.class
Normal file
BIN
chat/bin/network/Manager.class
Normal file
Binary file not shown.
BIN
chat/bin/network/TCPChat.class
Normal file
BIN
chat/bin/network/TCPChat.class
Normal file
Binary file not shown.
BIN
chat/bin/network/TCPServer.class
Normal file
BIN
chat/bin/network/TCPServer.class
Normal file
Binary file not shown.
BIN
chat/bin/network/Tools.class
Normal file
BIN
chat/bin/network/Tools.class
Normal file
Binary file not shown.
BIN
chat/bin/network/UDPInput.class
Normal file
BIN
chat/bin/network/UDPInput.class
Normal file
Binary file not shown.
BIN
chat/bin/network/UDPOutput.class
Normal file
BIN
chat/bin/network/UDPOutput.class
Normal file
Binary file not shown.
BIN
chat/lib/mysql-connector-java-5.0.5-bin.jar
Normal file
BIN
chat/lib/mysql-connector-java-5.0.5-bin.jar
Normal file
Binary file not shown.
293
chat/src/controller/Agent.java
Normal file
293
chat/src/controller/Agent.java
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
package controller;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.SocketException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.swing.text.BadLocationException;
|
||||||
|
import javax.swing.text.SimpleAttributeSet;
|
||||||
|
import javax.swing.text.StyleConstants;
|
||||||
|
import javax.swing.text.StyledDocument;
|
||||||
|
|
||||||
|
import gui.FenetreChat;
|
||||||
|
import model.*;
|
||||||
|
import network.*;
|
||||||
|
|
||||||
|
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> listTCP;
|
||||||
|
private DataBase db;
|
||||||
|
|
||||||
|
private PropertyChangeSupport support;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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();
|
||||||
|
this.listTCP = new ArrayList<TCPChat>();
|
||||||
|
this.support = new PropertyChangeSupport(this);
|
||||||
|
this.BIn.addPropertyChangeListener(this);
|
||||||
|
BIn.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void propertyChange(PropertyChangeEvent evt) {
|
||||||
|
switch (evt.getPropertyName()) {
|
||||||
|
case "Msg UDP Recu" :
|
||||||
|
System.out.println("envoi message");
|
||||||
|
Message msg = BIn.getMessage();
|
||||||
|
try {
|
||||||
|
handleMessage(msg);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "session chat demarree" :
|
||||||
|
System.out.println("dans session demarree");
|
||||||
|
TCPChat tcpChat = this.server.getConnexionTCPChat();
|
||||||
|
tcpChat.addPropertyChangeListener(this);
|
||||||
|
this.listTCP.add(tcpChat);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "Msg TCP Recu" :
|
||||||
|
SimpleAttributeSet left = new SimpleAttributeSet();
|
||||||
|
StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT);
|
||||||
|
StyleConstants.setForeground(left, Color.RED);
|
||||||
|
System.out.println("dans property change");
|
||||||
|
TCPChat tcpChatCo = this.listTCP.get(0);
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
MessageChat msgRecu = tcpChatCo.getMessageRecu();
|
||||||
|
//FenetreChat.getTa().append("kevin"+ " : "+msgRecu.getMessage()+"\n");
|
||||||
|
StyledDocument doc = FenetreChat.getDoc();
|
||||||
|
try {
|
||||||
|
doc.insertString(doc.getLength(), "\n"+msgRecu.getMessage(), left );
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
doc.setParagraphAttributes(doc.getLength(), 1, left, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Envoi sur 5001 et reçoit sur 5000
|
||||||
|
public void testSendBroadcast() throws IOException, InterruptedException {
|
||||||
|
MessagePseudo msg = new MessagePseudo(this.user.getAddress(), Tools.getLocalIp(), user.getPort(), 14000, 1, "Michel");
|
||||||
|
BOut.send(msg, user.getAddress(), user.getPort());
|
||||||
|
Thread.sleep(10);
|
||||||
|
MessagePseudo msgRecu = BIn.getMessage();
|
||||||
|
handleMessage(msgRecu);
|
||||||
|
MessagePseudo msg2 = new MessagePseudo(this.user.getAddress(), Tools.getLocalIp(), user.getPort(), 14000, 1, "Jacques");
|
||||||
|
BOut.send(msg2, user.getAddress(), user.getPort());
|
||||||
|
Thread.sleep(10);
|
||||||
|
MessagePseudo msgRecu2 = BIn.getMessage();
|
||||||
|
handleMessage(msgRecu2);
|
||||||
|
MessagePseudo msg3 = new MessagePseudo(this.user.getAddress(), Tools.getLocalIp(), user.getPort(), 14000, 1, "Bob");
|
||||||
|
BOut.send(msg3, user.getAddress(), user.getPort());
|
||||||
|
Thread.sleep(10);
|
||||||
|
MessagePseudo msgRecu3 = BIn.getMessage();
|
||||||
|
handleMessage(msgRecu3);
|
||||||
|
choisirPseudo("Bob");
|
||||||
|
choisirPseudo("Patrick");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*public void testSendTCP() throws IOException, InterruptedException {
|
||||||
|
|
||||||
|
TCPSend.sendMsg("COUCOU");
|
||||||
|
Thread.sleep(1000);
|
||||||
|
TCPSend.sendMsg("Ca va ?");
|
||||||
|
Thread.sleep(1000);
|
||||||
|
TCPSend.sendMsg("Non je suis KO");
|
||||||
|
Thread.sleep(1000);
|
||||||
|
TCPSend.sendMsg("Moi aussi :'(");
|
||||||
|
Thread.sleep(1000);
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*type 0 : premier message de broadcast
|
||||||
|
* type, 1 : deuxieme message de broadcast avec pseudo
|
||||||
|
* type 2 : Message de déconnexion
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void handleMessage(Message msg) throws IOException {
|
||||||
|
switch(msg.getTypeMessage()) {
|
||||||
|
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());
|
||||||
|
BOut.send(msgPresentation, msg.getAddressSrc(), msg.getPortSrc());
|
||||||
|
break;
|
||||||
|
case 1 :
|
||||||
|
MessagePseudo msgPseudo = (MessagePseudo) msg;
|
||||||
|
if(!list.pseudoExist(msgPseudo.getPseudo())) {
|
||||||
|
Contact newUser = new Contact(msgPseudo.getPseudo(), msgPseudo.getAddressSrc(), msgPseudo.getPortSrc());
|
||||||
|
list.addContact(newUser);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
/*case 2 :
|
||||||
|
MessageDeconnexion messageDeconnexion = (MessageDeconnexion) msg;
|
||||||
|
if(list.pseudoExist(messageDeconnexion.getPseudo())){
|
||||||
|
Contact contact = list.findContact(messageDeconnexion.getPseudo());
|
||||||
|
list.deleteContact(contact);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean connect(String pseudo) throws IOException, InterruptedException {
|
||||||
|
MessagePseudo msg_connexion = new MessagePseudo(this.localAddress, this.broadcast, this.user.getPort(), 25000, 0, "");
|
||||||
|
BOut.send(msg_connexion, this.broadcast, 25000);
|
||||||
|
Thread.sleep(5000);
|
||||||
|
ArrayList<MessagePseudo> msg_recus = BIn.getListMessage();
|
||||||
|
for(int i =0; i<msg_recus.size(); i++) {
|
||||||
|
handleMessage(msg_recus.get(i));
|
||||||
|
}
|
||||||
|
boolean pseudoOK = choisirPseudo(pseudo);
|
||||||
|
list.addContact(user);
|
||||||
|
if(pseudoOK){
|
||||||
|
int id = db.addUser(pseudo);
|
||||||
|
this.user.setId(id);
|
||||||
|
MessagePseudo msgPresentation = new MessagePseudo(this.localAddress, this.broadcast, this.user.getPort(), 25000, 1, this.user.getPseudo());
|
||||||
|
BOut.send(msgPresentation, this.broadcast, 25000);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean choisirPseudo(String pseudo) {
|
||||||
|
if(!list.pseudoExist(pseudo)){
|
||||||
|
user.setPseudo(pseudo);
|
||||||
|
System.out.println("Pseudo set : "+pseudo);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
System.out.println("Pseudo déjà utilisé");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deconnexion() throws IOException {
|
||||||
|
MessageDeconnexion msgDeconnexion = new MessageDeconnexion(this.localAddress, this.broadcast, this.user.getPort(), 25000, 3, user.getPseudo());
|
||||||
|
BOut.send(msgDeconnexion, this.broadcast, this.user.getPort());
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean changerPseudo(String pseudo) {
|
||||||
|
boolean changeOK = choisirPseudo(pseudo);
|
||||||
|
if(changeOK){
|
||||||
|
System.out.println("Pseudo changé à : "+pseudo);
|
||||||
|
db.updatePseudo(this.user.getId(), pseudo);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
System.out.println("Veuillez choisir un autre pseudo");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean chatExists(int destID) {
|
||||||
|
boolean chatExists = false;
|
||||||
|
for(TCPChat tcp : listTCP) {
|
||||||
|
if(tcp.getDestID()==destID) {
|
||||||
|
chatExists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chatExists;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createChat (int destId, String destPseudo) throws IOException {
|
||||||
|
boolean chatExists = chatExists(destId);
|
||||||
|
if(!chatExists) {
|
||||||
|
for(Contact user : list.getListe()) {
|
||||||
|
if(user.getPseudo().equals(destPseudo)) {
|
||||||
|
TCPChat connexionTCP = new TCPChat(user, destId);
|
||||||
|
listTCP.add(connexionTCP);
|
||||||
|
connexionTCP.addPropertyChangeListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void addPropertyChangeListener(PropertyChangeListener pcl, String propertyName){
|
||||||
|
this.support.addPropertyChangeListener(propertyName, pcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deletePropertyChangeListener(PropertyChangeListener pcl, String propertyName){
|
||||||
|
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 listTCP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TCPChat getTCPChat() {
|
||||||
|
return this.listTCP.remove(0);
|
||||||
|
}
|
||||||
|
}
|
200
chat/src/controller/DataBase.java
Normal file
200
chat/src/controller/DataBase.java
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
package controller;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public class DataBase {
|
||||||
|
|
||||||
|
//Connexion serveur GEI
|
||||||
|
//login : tp_servlet_018
|
||||||
|
//password : Taey2Aje
|
||||||
|
//Plus d'infs connexion sur moodle
|
||||||
|
|
||||||
|
private static DataBase instance = null;
|
||||||
|
|
||||||
|
public Connection connexion;
|
||||||
|
|
||||||
|
private DataBase() {
|
||||||
|
try {
|
||||||
|
Class.forName("com.mysql.jdbc.Driver");
|
||||||
|
}catch (ClassNotFoundException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DataBase getInstance() {
|
||||||
|
synchronized (DataBase.class) {
|
||||||
|
DataBase db = instance;
|
||||||
|
if(db == null) {
|
||||||
|
db = new DataBase();
|
||||||
|
}
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//retourne l'id associé au user ajouté
|
||||||
|
public int addUser(String pseudo) {
|
||||||
|
String query = "INSERT INTO users (pseudo, statut) VALUES (?, ?)";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setString(1, pseudo);
|
||||||
|
pStat.setString(2, "En ligne");
|
||||||
|
pStat.executeUpdate();
|
||||||
|
}catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
query = "SELECT * FROM users WHERE pseudo=?";
|
||||||
|
int id =0;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setString(1, pseudo);
|
||||||
|
ResultSet resId = pStat.executeQuery();
|
||||||
|
if(resId.first()) {
|
||||||
|
id = resId.getInt("id");
|
||||||
|
}
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPseudoFromId(int id) {
|
||||||
|
String pseudo = null;
|
||||||
|
String query = "SELECT * FROM users WHERE id=?";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setInt(1, id);
|
||||||
|
ResultSet resPseudo = pStat.executeQuery();
|
||||||
|
if(resPseudo.first()) {
|
||||||
|
pseudo = resPseudo.getString("pseudo");
|
||||||
|
}
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIdFromPseudo(String pseudo) {
|
||||||
|
int id = -1;
|
||||||
|
String query = "SELECT * FROM users WHERE pseudo='" + pseudo + "'";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
//pStat.setString(1, pseudo);
|
||||||
|
ResultSet resId = pStat.executeQuery();
|
||||||
|
if(resId.next()) {
|
||||||
|
id = resId.getInt(1);
|
||||||
|
}
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteFromId(int id) {
|
||||||
|
String query = "DELETE FROM `users` WHERE `id` = ?";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setInt(1, id);
|
||||||
|
pStat.executeUpdate();
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updatePseudo(int id, String pseudo) {
|
||||||
|
String query = "UPDATE `users` SET `pseudo`=? WHERE id=?";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setString(1, pseudo);
|
||||||
|
pStat.setInt(2, id);
|
||||||
|
pStat.executeUpdate();
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//chat table : nom : id1id2
|
||||||
|
//colonnes :
|
||||||
|
//id (l'id unique du message)
|
||||||
|
//id1 et id2 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) {
|
||||||
|
int idSrc = id1;
|
||||||
|
int idDest = id2;
|
||||||
|
if(id1>id2) {
|
||||||
|
idSrc = id2;
|
||||||
|
idDest = id1;
|
||||||
|
}
|
||||||
|
String nameTable = idSrc+"_"+idDest;
|
||||||
|
String query = "CREATE TABLE " +nameTable+" (\n" +
|
||||||
|
"id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, \n" +
|
||||||
|
"idSrc INT NOT NULL,\n" +
|
||||||
|
"idDest INT NOT NULL,\n" +
|
||||||
|
"message MEDIUMTEXT NOT NULL,\n" +
|
||||||
|
"date DATE NOT NULL\n" +
|
||||||
|
");";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.executeUpdate();
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tableChatExists(int id1, int id2) {
|
||||||
|
int idSrc = id1;
|
||||||
|
int idDest = id2;
|
||||||
|
boolean res = true;
|
||||||
|
if(id1>id2) {
|
||||||
|
idSrc = id2;
|
||||||
|
idDest = id1;
|
||||||
|
}
|
||||||
|
String nameTable = idSrc+"_"+idDest;
|
||||||
|
String query = "SELECT * FROM " + nameTable;
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.executeQuery();
|
||||||
|
}catch(SQLException e) {
|
||||||
|
res = false;
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
//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;
|
||||||
|
if(id1>id2) {
|
||||||
|
idSrc = id2;
|
||||||
|
idDest = id1;
|
||||||
|
}
|
||||||
|
String nameTable = idSrc+"_"+idDest;
|
||||||
|
String query = "INSERT INTO " + nameTable + "(idSrc, idDest, message, date) VALUES (?, ?, ?, CURRENT_TIME)";
|
||||||
|
PreparedStatement pStat = null;
|
||||||
|
try {
|
||||||
|
pStat = connexion.prepareStatement(query);
|
||||||
|
pStat.setInt(1, id1);
|
||||||
|
pStat.setInt(2, id2);
|
||||||
|
pStat.setString(3, message);
|
||||||
|
pStat.executeUpdate();
|
||||||
|
}catch(SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
chat/src/controller/Test.java
Normal file
15
chat/src/controller/Test.java
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package controller;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import network.Tools;
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
public static void main(String args[]) throws IOException, InterruptedException {
|
||||||
|
Agent agent1 = new Agent(Tools.getAdress()[0], 22001, 22000);
|
||||||
|
int id = agent1.getDb().getIdFromPseudo(agent1.getUser().getPseudo());
|
||||||
|
System.out.println("ID : "+id);
|
||||||
|
|
||||||
|
//Tools.printInterfaces();
|
||||||
|
}
|
||||||
|
}
|
1
chat/src/controller/package-info.java
Normal file
1
chat/src/controller/package-info.java
Normal file
|
@ -0,0 +1 @@
|
||||||
|
package controller;
|
125
chat/src/gui/FenetreAcc.java
Normal file
125
chat/src/gui/FenetreAcc.java
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
package gui;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.GridLayout;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
import javax.swing.BorderFactory;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import controller.*;
|
||||||
|
import network.Tools;
|
||||||
|
|
||||||
|
public class FenetreAcc implements ActionListener {
|
||||||
|
JFrame frame;
|
||||||
|
JPanel panel;
|
||||||
|
JTextField pseudofield;
|
||||||
|
JLabel Text;
|
||||||
|
JButton Connexion;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Constructeur d'une fenetre d'affichage pour la connexion d'un utilisateur.
|
||||||
|
* Cette fenetre sera munie d'un bouton de connexion et d'une zone de saisie de pseudo.
|
||||||
|
*/
|
||||||
|
public FenetreAcc() {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
//creer une instance JFrame
|
||||||
|
frame = new JFrame("Fenetre accueil");
|
||||||
|
//sortir quand l’utilisateur 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(3,1));
|
||||||
|
//Ajouter les elements
|
||||||
|
this.addWidgets();
|
||||||
|
//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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 user name", SwingConstants.CENTER);
|
||||||
|
//Ajout d'un bouton Connexion
|
||||||
|
this.Connexion = new JButton("Connexion");
|
||||||
|
//On associe au bouton Connexion des actions a realiser
|
||||||
|
this.Connexion.addActionListener(this);
|
||||||
|
// On ajouter les differents elements au panel
|
||||||
|
panel.add(pseudofield);
|
||||||
|
panel.add(Text);
|
||||||
|
panel.add(Connexion);
|
||||||
|
//ajouter un effet de bord transparent au composant Jlabel
|
||||||
|
Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actionPerformed(ActionEvent event) {
|
||||||
|
// on recupere le texte entree dans la zone de saisie
|
||||||
|
String pseudo = pseudofield.getText();
|
||||||
|
// On crée un objet de type ChatApp
|
||||||
|
Agent agent;
|
||||||
|
boolean connexion;
|
||||||
|
|
||||||
|
try {
|
||||||
|
agent = new Agent(Tools.getAdress()[0], 25001, 25000);
|
||||||
|
// on tente une connexion avec ce pseudo
|
||||||
|
connexion = agent.connect(pseudo);
|
||||||
|
// 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 {
|
||||||
|
// 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();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
System.out.println("connect impossible");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createAndShowGUI() {
|
||||||
|
// Etre certain d'avoir une joli fenetre
|
||||||
|
JFrame.setDefaultLookAndFeelDecorated(true);
|
||||||
|
// On crée une fentre d'acceuil
|
||||||
|
FenetreAcc fenetre = new FenetreAcc();
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
193
chat/src/gui/FenetreChat.java
Normal file
193
chat/src/gui/FenetreChat.java
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
package gui;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.WindowAdapter;
|
||||||
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.text.BadLocationException;
|
||||||
|
import javax.swing.text.SimpleAttributeSet;
|
||||||
|
import javax.swing.text.StyleConstants;
|
||||||
|
import javax.swing.text.StyledDocument;
|
||||||
|
|
||||||
|
import controller.Agent;
|
||||||
|
import model.Contact;
|
||||||
|
import model.MessageChat;
|
||||||
|
import network.TCPChat;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
public class FenetreChat extends JFrame {
|
||||||
|
|
||||||
|
JFrame frame;
|
||||||
|
Agent agent;
|
||||||
|
Contact dest; //destinataire du message
|
||||||
|
Contact user; //utilisateur
|
||||||
|
|
||||||
|
WindowAdapter wa;
|
||||||
|
JPanel panel;
|
||||||
|
static JTextArea ta;
|
||||||
|
|
||||||
|
static StyledDocument doc;
|
||||||
|
|
||||||
|
|
||||||
|
public FenetreChat(Agent agent, String userString) {
|
||||||
|
this.frame = new JFrame("Fenetre Chat avec "+ userString);
|
||||||
|
this.agent = agent;
|
||||||
|
this.user = agent.getUser();
|
||||||
|
this.dest = agent.getList().findContact(userString);
|
||||||
|
|
||||||
|
this.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
|
||||||
|
|
||||||
|
this.frame.setSize(new Dimension(400, 400));
|
||||||
|
this.frame.setResizable(true);
|
||||||
|
|
||||||
|
this.wa = new WindowAdapter() {
|
||||||
|
public void windowClosing(WindowEvent e) {
|
||||||
|
int quitter = FenetreMenu.fenetreFermeture();
|
||||||
|
if(quitter == 0) {
|
||||||
|
frame.dispose();
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
|
||||||
|
addWidgets();
|
||||||
|
frame.addWindowListener(wa);
|
||||||
|
frame.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void addWidgets() {
|
||||||
|
|
||||||
|
JTextPane textPane = new JTextPane();
|
||||||
|
|
||||||
|
this.doc = textPane.getStyledDocument();
|
||||||
|
|
||||||
|
|
||||||
|
SimpleAttributeSet right = new SimpleAttributeSet();
|
||||||
|
StyleConstants.setAlignment(right, StyleConstants.ALIGN_RIGHT);
|
||||||
|
StyleConstants.setForeground(right, Color.BLUE);
|
||||||
|
|
||||||
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
||||||
|
gridBagLayout.columnWidths = new int[]{394, 0};
|
||||||
|
gridBagLayout.rowHeights = new int[]{16, 220, 74, 0};
|
||||||
|
gridBagLayout.columnWeights = new double[]{0.0, Double.MIN_VALUE};
|
||||||
|
gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
|
||||||
|
this.frame.getContentPane().setLayout(gridBagLayout);
|
||||||
|
this.panel = new JPanel();
|
||||||
|
|
||||||
|
//zone pour rentrer les message à envoyer
|
||||||
|
JTextArea text = new JTextArea(10, 3);
|
||||||
|
text.setForeground(Color.BLACK);
|
||||||
|
text.setFont(new Font("Century Schoolbook", Font.PLAIN, 11));
|
||||||
|
text.setText("Enter your message");
|
||||||
|
text.setLineWrap(true);
|
||||||
|
|
||||||
|
JScrollPane sp = new JScrollPane(text);
|
||||||
|
|
||||||
|
//zone affichage texte
|
||||||
|
//this.ta = new JTextArea(20, 20);
|
||||||
|
//this.ta.setLineWrap(true);
|
||||||
|
//this.ta.setText("");
|
||||||
|
JScrollPane sp2 = new JScrollPane(textPane);
|
||||||
|
//this.ta.setEditable(false);
|
||||||
|
GridBagConstraints gbc = new GridBagConstraints();
|
||||||
|
gbc.fill = GridBagConstraints.BOTH;
|
||||||
|
gbc.insets = new Insets(0, 0, 5, 0);
|
||||||
|
gbc.gridx = 0;
|
||||||
|
gbc.gridy = 1;
|
||||||
|
frame.getContentPane().add(sp2, gbc);
|
||||||
|
|
||||||
|
//bouton envoyer
|
||||||
|
JButton envoyer = new JButton("Send");
|
||||||
|
frame.getRootPane().setDefaultButton(envoyer);
|
||||||
|
envoyer.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
String message = text.getText();
|
||||||
|
System.out.println("Message :"+ message);
|
||||||
|
System.out.println(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);
|
||||||
|
try {
|
||||||
|
TCPChat tcpChat = null;
|
||||||
|
for(TCPChat tcp : agent.getListeTCPChat()) {
|
||||||
|
if (tcp.getDestID() == idDest) {
|
||||||
|
tcpChat = tcp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//text.append(message);
|
||||||
|
text.setText("");
|
||||||
|
//ta.append(agent.getUser().getPseudo()+ " : "+message+"\n");
|
||||||
|
//ta.setText("");
|
||||||
|
tcpChat.sendMsg(message);
|
||||||
|
doc.insertString(doc.getLength(), "\n"+message, right );
|
||||||
|
doc.setParagraphAttributes(doc.getLength(), 1, right, false);
|
||||||
|
if(agent.getDb().tableChatExists(idUser, idDest)) {
|
||||||
|
agent.getDb().addMessage(idUser, idDest, message);
|
||||||
|
}else {
|
||||||
|
agent.getDb().newChatTable(idUser, idDest);
|
||||||
|
agent.getDb().addMessage(idUser, idDest, message);
|
||||||
|
}
|
||||||
|
} catch (IOException | BadLocationException e1) {
|
||||||
|
System.out.println("Envoi du message impossible");
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}});
|
||||||
|
|
||||||
|
panel.add(BorderLayout.CENTER, sp);
|
||||||
|
panel.add(BorderLayout.SOUTH,envoyer);
|
||||||
|
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
|
||||||
|
|
||||||
|
GridBagConstraints gbc_panel = new GridBagConstraints();
|
||||||
|
gbc_panel.anchor = GridBagConstraints.NORTH;
|
||||||
|
gbc_panel.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
gbc_panel.gridx = 0;
|
||||||
|
gbc_panel.gridy = 2;
|
||||||
|
frame.getContentPane().add(panel, gbc_panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static JTextArea getTa() {
|
||||||
|
return ta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setTa(JTextArea ta) {
|
||||||
|
this.ta = ta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static StyledDocument getDoc() {
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void setDoc(StyledDocument doc) {
|
||||||
|
FenetreChat.doc = doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@Override
|
||||||
|
public void propertyChange(PropertyChangeEvent evt) {
|
||||||
|
switch (evt.getPropertyName()) {
|
||||||
|
case "Msg TCP Recu" :
|
||||||
|
System.out.println("dans property change");
|
||||||
|
TCPChat tcpChat = agent.getTCPChat();
|
||||||
|
MessageChat msgRecu = tcpChat.getMessageRecu();
|
||||||
|
ta.append(dest.getPseudo()+ " : "+msgRecu.getMessage()+"\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
234
chat/src/gui/FenetreMenu.java
Normal file
234
chat/src/gui/FenetreMenu.java
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
package gui;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.GridLayout;
|
||||||
|
import java.awt.SystemColor;
|
||||||
|
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.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;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuBar;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
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 controller.Agent;
|
||||||
|
import model.Contact;
|
||||||
|
|
||||||
|
public class FenetreMenu {
|
||||||
|
JFrame frame;
|
||||||
|
JPanel panel;
|
||||||
|
JMenuBar menu;
|
||||||
|
Agent agent;
|
||||||
|
JLabel jlabel;
|
||||||
|
JLabel texte;
|
||||||
|
JLabel liste;
|
||||||
|
WindowAdapter wa ;
|
||||||
|
|
||||||
|
public FenetreMenu(Agent agent) {
|
||||||
|
this.agent = agent;
|
||||||
|
frame = new JFrame("Fenêtre menu");
|
||||||
|
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
|
||||||
|
|
||||||
|
frame.setSize(new Dimension(100, 100));
|
||||||
|
|
||||||
|
wa = new WindowAdapter(){
|
||||||
|
public void windowClosing(WindowEvent e){
|
||||||
|
int reponse = fenetreFermeture();
|
||||||
|
if (reponse==0){
|
||||||
|
try {
|
||||||
|
// on deconnecte l'app avant de quitter
|
||||||
|
// Tout les utilisateurs sont donc prevenus du depart
|
||||||
|
agent.deconnexion();
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
frame.dispose();
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
|
||||||
|
|
||||||
|
frame.addWindowListener(wa);
|
||||||
|
menu = new JMenuBar();
|
||||||
|
//Creation d'un JPanel
|
||||||
|
panel = new JPanel(new GridLayout(3,1));
|
||||||
|
panel.setForeground(SystemColor.menuText);
|
||||||
|
// Ajouter tout les elements a la fenetre
|
||||||
|
this.addWidgets();
|
||||||
|
// ajouter le panel a la fenetre
|
||||||
|
frame.getContentPane().add(panel, BorderLayout.CENTER);
|
||||||
|
// Afficher la fenetre
|
||||||
|
frame.pack();
|
||||||
|
frame.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fenetreFermeture() {
|
||||||
|
return JOptionPane.showConfirmDialog(
|
||||||
|
null,
|
||||||
|
"Are you sure you wanna quit?",
|
||||||
|
"Quitter",
|
||||||
|
JOptionPane.YES_NO_OPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addWidgets() {
|
||||||
|
jlabel = new JLabel(new ImageIcon("/Users/momof/eclipse-workspace/chat/src/images/panda.png"), JLabel.CENTER);
|
||||||
|
texte = new JLabel("Bienvenue sur ce magnifique chat " + agent.getUser().getPseudo());
|
||||||
|
texte.setFont(new Font("Century Schoolbook", Font.PLAIN, 40));
|
||||||
|
texte.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
|
liste = new JLabel("Active users", JLabel.LEFT);
|
||||||
|
|
||||||
|
JMenu contenu = new JMenu("Actions");
|
||||||
|
contenu.setForeground(Color.BLUE);
|
||||||
|
contenu.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
|
|
||||||
|
JButton refresh = new JButton("Refresh");
|
||||||
|
refresh.setForeground(Color.GRAY);
|
||||||
|
refresh.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
|
|
||||||
|
//JMenuItem usersActifs = new JMenuItem("Active users");
|
||||||
|
JMenuItem modifierPseudo = new JMenuItem("Modify your pseudo");
|
||||||
|
JMenuItem deco = new JMenuItem("Deconnection");
|
||||||
|
|
||||||
|
//contenu.add(usersActifs);
|
||||||
|
contenu.add(modifierPseudo);
|
||||||
|
contenu.add(deco);
|
||||||
|
|
||||||
|
|
||||||
|
menu.add(contenu);
|
||||||
|
menu.add(refresh);
|
||||||
|
frame.setJMenuBar(menu);
|
||||||
|
|
||||||
|
/*liste déroulante des utilsateurs actifs,
|
||||||
|
* cliquer dessus pour créer une fenêtre de chat*/
|
||||||
|
JTextArea ta = new JTextArea(20,20);
|
||||||
|
ta.insert("Active users\n",0);
|
||||||
|
JScrollPane scrollPane = new JScrollPane(ta);
|
||||||
|
|
||||||
|
String users = agent.getList().actifUsers();
|
||||||
|
Vector<String> v = new Vector<String>();
|
||||||
|
for(String pseudo : users.split("\n")) {
|
||||||
|
v.add(pseudo);
|
||||||
|
}
|
||||||
|
|
||||||
|
JComboBox cb = new JComboBox(v);
|
||||||
|
cb.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent event) {
|
||||||
|
Object selected = cb.getSelectedItem();
|
||||||
|
int idDest = agent.getDb().getIdFromPseudo(selected.toString());
|
||||||
|
try {
|
||||||
|
agent.createChat(idDest, selected.toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("Creation tcp chat impossible");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
new FenetreChat(agent, selected.toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*actions pour refresh*/
|
||||||
|
refresh.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
String users = agent.getList().actifUsers();
|
||||||
|
for(String pseudo : users.split("\n")) {
|
||||||
|
if (!v.contains(pseudo)) {
|
||||||
|
v.add(pseudo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JComboBox cb = new JComboBox(v);
|
||||||
|
cb.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent event) {
|
||||||
|
Object selected = cb.getSelectedItem();
|
||||||
|
int idDest = agent.getDb().getIdFromPseudo(selected.toString());
|
||||||
|
try {
|
||||||
|
agent.createChat(idDest, selected.toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("Creation tcp chat impossible");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
new FenetreChat(agent, selected.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}});
|
||||||
|
|
||||||
|
frame.getContentPane().add(refresh, BorderLayout.NORTH);
|
||||||
|
panel.add(BorderLayout.CENTER, jlabel);
|
||||||
|
panel.add(BorderLayout.SOUTH , texte );
|
||||||
|
panel.add(BorderLayout.WEST, cb);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*actions pour modifier le pseudo*/
|
||||||
|
modifierPseudo.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
JLabel Text = new JLabel("Enter your new pseudo", SwingConstants.CENTER);
|
||||||
|
JTextField field = new JTextField(2);
|
||||||
|
JButton cancel = new JButton("Cancel");
|
||||||
|
cancel.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
frame.dispose();
|
||||||
|
new FenetreMenu(agent);
|
||||||
|
}});
|
||||||
|
JButton ok = new JButton("Continue");
|
||||||
|
frame.getRootPane().setDefaultButton(ok);
|
||||||
|
ok.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
String newPseudo = field.getText();
|
||||||
|
if(agent.changerPseudo(newPseudo)) {
|
||||||
|
JOptionPane.showMessageDialog(frame, "Your new pseudo is "+newPseudo);
|
||||||
|
frame.dispose();
|
||||||
|
new FenetreMenu(agent);
|
||||||
|
}else {
|
||||||
|
JOptionPane.showMessageDialog(frame, "Pseudo already, use choose another one");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
JPanel panel1 = new JPanel(new GridLayout(4,1));
|
||||||
|
panel1.add(cancel);
|
||||||
|
panel1.add(Text);
|
||||||
|
panel1.add(field);
|
||||||
|
panel1.add(ok);
|
||||||
|
frame.getContentPane().removeAll();
|
||||||
|
frame.getContentPane().add(panel1,BorderLayout.CENTER);
|
||||||
|
frame.setVisible(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
deco.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
try {
|
||||||
|
agent.deconnexion();
|
||||||
|
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
|
||||||
|
} catch (IOException e1) {
|
||||||
|
System.out.println("Deconnexion impossible");
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//panel.add(BorderLayout.NORTH, menu);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
1
chat/src/gui/package-info.java
Normal file
1
chat/src/gui/package-info.java
Normal file
|
@ -0,0 +1 @@
|
||||||
|
package gui;
|
BIN
chat/src/gui/panda.png
Normal file
BIN
chat/src/gui/panda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
BIN
chat/src/images/panda.png
Normal file
BIN
chat/src/images/panda.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.8 KiB |
66
chat/src/model/Contact.java
Normal file
66
chat/src/model/Contact.java
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package model;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
public class Contact {
|
||||||
|
|
||||||
|
private String pseudo;
|
||||||
|
private String status;
|
||||||
|
private int port;
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private InetAddress address;
|
||||||
|
|
||||||
|
|
||||||
|
public Contact(String pseudo, InetAddress address, int port) {
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
this.address = address;
|
||||||
|
this.status = "";
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPseudo() {
|
||||||
|
return this.pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPseudo(String pseudo) {
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InetAddress getAddress() {
|
||||||
|
return this.address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(InetAddress address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatut() {
|
||||||
|
return this.status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatut(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(int port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "Pseudo : " + pseudo + " status : " + status + " \n";
|
||||||
|
}
|
||||||
|
}
|
96
chat/src/model/ListeContacts.java
Normal file
96
chat/src/model/ListeContacts.java
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
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() {
|
||||||
|
this.listeContact = new ArrayList<Contact>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final ListeContacts getInstance() {
|
||||||
|
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())){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean pseudoExist(String pseudo) {
|
||||||
|
for(Contact c : listeContact) {
|
||||||
|
if(c.getPseudo().equals(pseudo)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addContact(Contact contact) {
|
||||||
|
if(!contactExist(contact)){
|
||||||
|
System.out.println("Pseudo : "+contact.getPseudo()+" ajouté\n");
|
||||||
|
listeContact.add(contact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteContact(Contact contact) {
|
||||||
|
if(contactExist(contact)){
|
||||||
|
System.out.println("Pseudo : "+contact.getPseudo()+"supprimé\n");
|
||||||
|
listeContact.remove(contact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int length() {
|
||||||
|
int n = 0;
|
||||||
|
while(!listeContact.isEmpty()) {
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Contact findContact(String pseudo) {
|
||||||
|
Contact contact = null;
|
||||||
|
for(Contact c : listeContact) {
|
||||||
|
if(c.getPseudo().equals(pseudo)){
|
||||||
|
contact = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String actifUsers() {
|
||||||
|
String users = "";
|
||||||
|
for(Contact c : this.listeContact) {
|
||||||
|
users += (c.getPseudo()+"\n");
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Contact> getListe() {
|
||||||
|
return listeContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setListeContact(ArrayList<Contact> listeContact) {
|
||||||
|
this.listeContact = listeContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
75
chat/src/model/Message.java
Normal file
75
chat/src/model/Message.java
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
package model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.net.*;
|
||||||
|
|
||||||
|
public class Message implements Serializable{
|
||||||
|
|
||||||
|
protected InetAddress addressSrc;
|
||||||
|
protected InetAddress addressDest;
|
||||||
|
protected int portSrc;
|
||||||
|
protected int portDest;
|
||||||
|
protected int typeMessage;
|
||||||
|
|
||||||
|
|
||||||
|
public Message(InetAddress addressSrc, InetAddress addressDest, int portSrc, int portDest, int typeMessage) {
|
||||||
|
this.addressSrc = addressSrc;
|
||||||
|
this.addressDest = addressDest;
|
||||||
|
this.portSrc = portSrc;
|
||||||
|
this.portDest = portDest;
|
||||||
|
this.typeMessage = typeMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public InetAddress getAddressSrc() {
|
||||||
|
return addressSrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setAddressSrc(InetAddress addressSrc) {
|
||||||
|
this.addressSrc = addressSrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public InetAddress getAddressDest() {
|
||||||
|
return addressDest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setAddressDest(InetAddress addressDest) {
|
||||||
|
this.addressDest = addressDest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getPortSrc() {
|
||||||
|
return portSrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setPortSrc(int portSrc) {
|
||||||
|
this.portSrc = portSrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getPortDest() {
|
||||||
|
return portDest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setPortDest(int portDest) {
|
||||||
|
this.portDest = portDest;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getTypeMessage() {
|
||||||
|
return typeMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setTypeMessage(int typeMessage) {
|
||||||
|
this.typeMessage = typeMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
22
chat/src/model/MessageChat.java
Normal file
22
chat/src/model/MessageChat.java
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package model;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
public class MessageChat extends Message{
|
||||||
|
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public MessageChat(InetAddress addressSrc, InetAddress addressDest, int portSrc, int portDest, int typeMessage, String message) {
|
||||||
|
super(addressSrc, addressDest, portSrc, portDest, typeMessage);
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
chat/src/model/MessageDeconnexion.java
Normal file
26
chat/src/model/MessageDeconnexion.java
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package model;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
public class MessageDeconnexion extends Message{
|
||||||
|
private String msg;
|
||||||
|
private String pseudo;
|
||||||
|
|
||||||
|
public MessageDeconnexion(InetAddress addressSrc, InetAddress addressDest, int portSrc, int portDest, int typeMessage, String pseudo) {
|
||||||
|
super(addressSrc, addressDest, portSrc, portDest, typeMessage);
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
this.msg = "Deconnexion";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPseudo() {
|
||||||
|
return pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPseudo(String pseudo) {
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMsg() {
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
}
|
23
chat/src/model/MessagePseudo.java
Normal file
23
chat/src/model/MessagePseudo.java
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package model;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
public class MessagePseudo extends Message{
|
||||||
|
|
||||||
|
private String pseudo;
|
||||||
|
|
||||||
|
public MessagePseudo(InetAddress addressSrc, InetAddress addressDest, int portSrc, int portDest, int typeMessage,String pseudo) {
|
||||||
|
super(addressSrc, addressDest, portSrc, portDest, typeMessage);
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPseudo() {
|
||||||
|
return pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPseudo(String pseudo) {
|
||||||
|
this.pseudo = pseudo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
5
chat/src/module-info.java
Normal file
5
chat/src/module-info.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module chat {
|
||||||
|
requires java.desktop;
|
||||||
|
requires java.sql;
|
||||||
|
requires mysql.connector.java;
|
||||||
|
}
|
19
chat/src/network/Manager.java
Normal file
19
chat/src/network/Manager.java
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package network;
|
||||||
|
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class Manager {
|
||||||
|
private static int port;
|
||||||
|
|
||||||
|
|
||||||
|
private DatagramSocket broadcast;
|
||||||
|
|
||||||
|
private HashMap<String, Integer> portMap;
|
||||||
|
|
||||||
|
//network
|
||||||
|
|
||||||
|
|
||||||
|
}
|
112
chat/src/network/TCPChat.java
Normal file
112
chat/src/network/TCPChat.java
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
package network;
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import controller.Agent;
|
||||||
|
import model.Contact;
|
||||||
|
import model.MessageChat;
|
||||||
|
|
||||||
|
public class TCPChat extends Thread{
|
||||||
|
|
||||||
|
private ArrayList<MessageChat> listeMessagesRecu;
|
||||||
|
private Socket socket;
|
||||||
|
private int destID;
|
||||||
|
private PropertyChangeSupport support;
|
||||||
|
|
||||||
|
|
||||||
|
//connexion faite par un autre user
|
||||||
|
public TCPChat(Socket socket) {
|
||||||
|
this.socket = socket;
|
||||||
|
listeMessagesRecu = new ArrayList<MessageChat>();
|
||||||
|
this.support = new PropertyChangeSupport(this);
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
//connexion faite par le user
|
||||||
|
public TCPChat(Contact destUser, int destID) throws IOException {
|
||||||
|
this.socket = new Socket(destUser.getAddress(), destUser.getPort());
|
||||||
|
listeMessagesRecu = new ArrayList<MessageChat>();
|
||||||
|
this.destID = destID;
|
||||||
|
this.support = new PropertyChangeSupport(this);
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void addPropertyChangeListener(PropertyChangeListener pcl) {
|
||||||
|
this.support.addPropertyChangeListener("Msg TCP Recu", pcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
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) {
|
||||||
|
System.out.println("Création et read du in impossible");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (IOException e1) {
|
||||||
|
System.out.println("pb création in");
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMsg(String message) throws IOException {
|
||||||
|
PrintWriter out = new PrintWriter(this.socket.getOutputStream(),true);
|
||||||
|
out.println(message);
|
||||||
|
System.out.println("Message envoyé : "+message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public MessageChat getMessageRecu() {
|
||||||
|
return listeMessagesRecu.remove(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<MessageChat> getListeMessagesRecu() {
|
||||||
|
return listeMessagesRecu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setListeMessagesRecu(ArrayList<MessageChat> listeMessagesRecu) {
|
||||||
|
this.listeMessagesRecu = listeMessagesRecu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Socket getSocket() {
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSocket(Socket socket) {
|
||||||
|
this.socket = socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDestID() {
|
||||||
|
return destID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDestID(int destID) {
|
||||||
|
this.destID = destID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
61
chat/src/network/TCPServer.java
Normal file
61
chat/src/network/TCPServer.java
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
package network;
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class TCPServer extends Thread{
|
||||||
|
|
||||||
|
private ServerSocket socket;
|
||||||
|
private InetAddress address;
|
||||||
|
private int port;
|
||||||
|
private ArrayList<TCPChat> listeConnexions;
|
||||||
|
private PropertyChangeSupport support;
|
||||||
|
|
||||||
|
public TCPServer(int port, InetAddress address) throws IOException {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addPropertyChangeListener(PropertyChangeListener pcl){
|
||||||
|
this.support.addPropertyChangeListener("session chat demarree",pcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Socket link;
|
||||||
|
try {
|
||||||
|
link = socket.accept();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public InetAddress getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(InetAddress address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TCPChat getConnexionTCPChat() {
|
||||||
|
return this.listeConnexions.remove(0);
|
||||||
|
}
|
||||||
|
}
|
69
chat/src/network/Tools.java
Normal file
69
chat/src/network/Tools.java
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package network;
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
public class Tools {
|
||||||
|
|
||||||
|
public static InetAddress getLocalIp(){
|
||||||
|
try{
|
||||||
|
InetAddress address = InetAddress.getLocalHost();
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
catch (UnknownHostException e){
|
||||||
|
System.out.println ("Could not find local address!");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//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;
|
||||||
|
InetAddress broadcastAddress = null;
|
||||||
|
InetAddress[] tab = {null,null};
|
||||||
|
try {
|
||||||
|
interfaces = NetworkInterface.getNetworkInterfaces();
|
||||||
|
while (interfaces.hasMoreElements())
|
||||||
|
{
|
||||||
|
NetworkInterface networkInterface = interfaces.nextElement();
|
||||||
|
if (networkInterface.getName().equals("wlan3")){
|
||||||
|
localAdress = networkInterface.getInterfaceAddresses().get(0).getAddress();
|
||||||
|
tab[0] = localAdress;
|
||||||
|
broadcastAddress = networkInterface.getInterfaceAddresses().get(0).getBroadcast();
|
||||||
|
tab[1] = broadcastAddress;
|
||||||
|
System.out.println("Found adress : " + localAdress);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SocketException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printInterfaces() {
|
||||||
|
Enumeration<NetworkInterface> interfaces = null;
|
||||||
|
try {
|
||||||
|
interfaces = NetworkInterface.getNetworkInterfaces();
|
||||||
|
while (interfaces.hasMoreElements())
|
||||||
|
{
|
||||||
|
NetworkInterface networkInterface = interfaces.nextElement();
|
||||||
|
try {
|
||||||
|
InetAddress adr = networkInterface.getInterfaceAddresses().get(0).getAddress();
|
||||||
|
if(adr!=null) {
|
||||||
|
System.out.println(networkInterface.getName() + adr );
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (SocketException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
73
chat/src/network/UDPInput.java
Normal file
73
chat/src/network/UDPInput.java
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
package network;
|
||||||
|
|
||||||
|
import model.*;
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
||||||
|
public class UDPInput extends Thread{
|
||||||
|
private DatagramSocket socket;
|
||||||
|
private ArrayList<MessagePseudo> messageReceived;
|
||||||
|
private PropertyChangeSupport support;
|
||||||
|
|
||||||
|
public UDPInput(InetAddress localAddress, int port) throws SocketException {
|
||||||
|
this.socket = new DatagramSocket(port, localAddress);
|
||||||
|
this.socket.setBroadcast(true);
|
||||||
|
this.messageReceived = new ArrayList<MessagePseudo>();
|
||||||
|
this.support = new PropertyChangeSupport(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<MessagePseudo> getListMessage (){
|
||||||
|
return this.messageReceived;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessagePseudo getMessage() {
|
||||||
|
return this.messageReceived.remove(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void addPropertyChangeListener(PropertyChangeListener pcl) {
|
||||||
|
this.support.addPropertyChangeListener("Msg UDP Recu", pcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
byte[] buffer = new byte[5000];
|
||||||
|
while(true) {
|
||||||
|
DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length);
|
||||||
|
try {
|
||||||
|
socket.receive(inPacket);
|
||||||
|
} catch (IOException e) {
|
||||||
|
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();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
System.out.println("Objet pas lu");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
chat/src/network/UDPOutput.java
Normal file
50
chat/src/network/UDPOutput.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package network;
|
||||||
|
import model.*;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.net.*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class UDPOutput {
|
||||||
|
private Contact user;
|
||||||
|
private DatagramSocket socket;
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
public UDPOutput(Contact user, int port) throws SocketException {
|
||||||
|
this.user = user;
|
||||||
|
this.port = port;
|
||||||
|
this.socket = new DatagramSocket(port, user.getAddress());
|
||||||
|
this.socket.setBroadcast(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void send(MessagePseudo 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");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void send(MessageDeconnexion 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.getMsg()+" et num port destination = "+portSrc+"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue