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()); 
		} 
	} 
 
}