www.pudn.com > CHAT-SERVEUR-CLIENT-APPLET.zip > Client.java
/*
* Cette applet est le client du chat. Elle commence par initialiser ses composants graphiques (fonction init),
* puis la fonction start lance cette classe en thread, ce qui déclenche la méthode run.
* Je ne sais pas si c'était vraiment utile dans notre cas d'utiliser un thread, mais ça peut l'être dans d'autres cas
* lorsqu'on veut effectuer plusieurs tâches en parallèle. Bref, la méthode run se connecte au serveur
* puis se met à son écoute. A chaque fois que le serveur envoie un message, elle regarde la première partie
* de ce message (qui indique le type de message), et écrit la 2è partie du message dans la JTextPane avec des styles
* d'écriture différents selon le type du message.
* Les autres fonctions servent à réagir aux évènements, notamment dans le cas où l'utilisateur veut envoyer
* un message sur le chat.
*/
import javax.swing.JPanel;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import java.awt.Container;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.io.PrintStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Client extends JApplet implements Runnable, ActionListener, KeyListener {
//attributs panneau de login
JPanel panelLogin;
JTextField textFieldLogin;
JButton buttonLogin;
JLabel labelLogin;
//attributs panneau de chat
JPanel panelChat;
JTextPane textPaneChat;
JTextField textFieldChat;
JButton buttonChat;
JLabel labelChat;
JScrollPane scrollChat;
//attributs réseau
String ipServeur;
int portServeur;
Socket sk;
BufferedReader depuisServeur;
PrintStream versServeur;
//autres attributs
Thread thread;
Container cp;
public void init() {
ipServeur = getParameter("ipServeur"); //on récupère un paramètre précisé dans la page html
portServeur = Integer.parseInt(getParameter("portServeur")); //on récupère un autre paramètre de la page html
cp = getContentPane(); //on récupère le panneau de l'applet
cp.setLayout(null); //On désactive la mise en forme du panneau principal, pour positionner les objets via des coordonnées
//attributs pour le panneau de login
panelLogin = new JPanel(); //panneau de login
panelLogin.setLayout(null);
panelLogin.setBounds(0,0,750,420); //on lui donne la taille totale de l'applet
panelLogin.setBackground(new Color(213,232,251));
cp.add(panelLogin);
labelLogin = new JLabel("Entrez un identifiant :");
labelLogin.setBounds(165,180,140,20);
panelLogin.add(labelLogin);
textFieldLogin = new JTextField(30);
textFieldLogin.setBounds(290,180,200,20);
textFieldLogin.addKeyListener(this);//pour repérer les frappes de touches du clavier quand le focus est sur textFieldLogin
panelLogin.add(textFieldLogin);
buttonLogin = new JButton("Entrer");
buttonLogin.setBounds(500,180,90,20);
buttonLogin.addActionListener(this);//pour repérer les évènements liés à buttonLogin
buttonLogin.addKeyListener(this);//pour repérer les frappes de touches du clavier quand le focus est sur buttonLogin
panelLogin.add(buttonLogin);
//attributs pour le panneau de chat
panelChat = new JPanel();//panneau de chat
panelChat.setLayout(null);
panelChat.setBounds(0,0,750,420);//on lui donne la taille totale de l'applet
panelChat.setBackground(new Color(213,232,251));
panelChat.setVisible(false);
cp.add(panelChat);
textPaneChat = new JTextPane();
textPaneChat.setEditable(false);
scrollChat = new JScrollPane(textPaneChat);
scrollChat.setBounds(10,10,730,370);
scrollChat.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
panelChat.add(scrollChat);
labelChat = new JLabel("Message :");
labelChat.setBounds(10,390,60,20);
panelChat.add(labelChat);
textFieldChat = new JTextField(30);
textFieldChat.setBounds(75,390,565,20);
textFieldChat.addKeyListener(this);//pour repérer les frappes de touches du clavier quand le focus est sur textFieldChat
panelChat.add(textFieldChat);
buttonChat = new JButton("Envoyer");
buttonChat.setBounds(650,390,90,20);
buttonChat.addActionListener(this);//pour repérer les évènements liés à buttonChat
buttonChat.addKeyListener(this);//pour repérer les frappes de touches du clavier quand le focus est sur buttonChat
panelChat.add(buttonChat);
}
public void start() {
if (thread == null) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
}
public void run() {
try {
connexion();//connexion au serveur de chat
DefaultStyledDocument docPane = (DefaultStyledDocument)textPaneChat.getDocument();
Style normal = textPaneChat.addStyle("normal", textPaneChat.getLogicalStyle());
Style gras = textPaneChat.addStyle("gras", textPaneChat.getLogicalStyle());
StyleConstants.setBold(gras, true);
Style italique = textPaneChat.addStyle("italique", textPaneChat.getLogicalStyle());
StyleConstants.setItalic(italique, true);
String line;
while ((line = depuisServeur.readLine()) != null) {//pour chaque message reçu du serveur...
String entete = line.substring(0, line.indexOf(':'));
String corps = line.substring(line.indexOf(':')+1);
if(entete.equals("general")){
docPane.insertString(textPaneChat.getDocument().getLength(),corps + "\n", italique);
} else if(entete.equals("user")){
docPane.insertString(textPaneChat.getDocument().getLength(),corps.substring(0, corps.indexOf(':')) + " : ", gras);
docPane.insertString(textPaneChat.getDocument().getLength(),corps.substring(corps.indexOf(':')+1) + "\n", normal);
}
textPaneChat.setCaretPosition(textPaneChat.getDocument().getLength()); //pour mettre le curseur tout en bas du textPaneChat
textPaneChat.requestFocus();//pour que le textPaneChat aille jusqu'au curseur, cad tout en bas
textFieldChat.requestFocus();//pour redonner la main au textFieldChat
}
} catch (Exception e) {
System.out.println("erreur run : " + e.getMessage());
e.printStackTrace();
} finally {
disconnect();
}
}
public void actionPerformed(ActionEvent evt)
// Permet de traiter un événement en fonction de l'objet source
{
Object source = evt.getSource();
if (source == buttonLogin){
login();
}else if (source == buttonChat){
sendText();
}
}
public void keyPressed(KeyEvent evt){
//cette fonction ne nous sert pas, mais on est obligé de l'écrire car notre classe implémente l'interface KeyListener
}
public void keyReleased(KeyEvent evt){
//cette fonction ne nous sert pas, mais on est obligé de l'écrire car notre classe implémente l'interface KeyListener
}
public void keyTyped(KeyEvent evt) { //quand on appuie sur une touche...
Object source = evt.getSource();
if(source==buttonLogin && evt.getKeyChar() == '\n')
login();
else if(source==textFieldLogin && evt.getKeyChar() == '\n')
login();
else if(source==textFieldChat && evt.getKeyChar() == '\n')
sendText();
else if(source==buttonChat && evt.getKeyChar() == '\n')
sendText();
}
public void sendText() { //envoi d'un message au serveur
if (textFieldChat.getText().equals("")) {
showStatus("Vous devez entrer un message");
return;
} else if(textFieldChat.getText().length() > 10000) {
showStatus("Texte trop long");
return;
} else {
versServeur.println("message:" + textFieldChat.getText());
textFieldChat.setText("");
}
}
public void login(){ //pour s'identifier sur le serveur
if (textFieldLogin.getText().equals("")) {
showStatus("Vous devez entrer un identifiant");
}else {
try{
versServeur.println("login:" + textFieldLogin.getText());
} catch (Exception e){
System.out.println("erreur dans sendLogin() : " + e.getMessage());
}
panelLogin.setVisible(false);
panelChat.setVisible(true);
textFieldChat.requestFocus();
}
}
public void connexion(){ //pour se connecter au serveur
try{
sk = new Socket(ipServeur,portServeur); //connexion au serveur via une socket
depuisServeur = new BufferedReader(new InputStreamReader(sk.getInputStream())); //on récupère le flux entrant
versServeur = new PrintStream(new DataOutputStream(sk.getOutputStream())); //on récupère le flux sortant
}catch(Exception e){
System.out.println("erreur connect : " + e.getMessage());
}
}
public void disconnect() { //pour se déconnecter du serveur
try {
sk.close();
} catch (Exception e) {
System.out.println("erreur disconnect : " + e.getMessage());
}
}
}