Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage Java > communication client_serveur java > Lecture du sujet

communication client_serveur java

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne meryazer # Posté le 03/07/2008 à 15:14:33
Avatar
Groupe : Membres
Bonjour
j'ai un stage dont le sujet du projet est de créer un service de messagerie instantanée en java, donc une communication client_serveur et client_client.
pour l'instant je n'ai arrivé permettre aux cliens d'envoyer leurs messages qui seront ainsi recu par le serveur et les autres clients.
alors que le travail demandé est encore plus compliqué (pour moi :( ), c'est que le serveur aussi doit avoir le droit d'envoyer des messages aux clients, il peut meme envoyé des messages privés pour quelques uns.

voici les codes

Client.java

package chattel;
import java.io.*;
import java.net.*;
import java.util.*;

public class Client {

private Socket socket;
private String name;
private final int PORT=36000;

public Client(Socket s, String n){
this.socket=s;
this.name=n;
}

public static void main(String[] args) {


try {
Socket connexion = new Socket("127.0.0.1", 36000);

PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
BufferedReader entree = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));

Scanner sc=new Scanner(System.in);
System.out.println("Saisissez votre pseudo");
String str=sc.nextLine();
sortie.println("Nouveau client "+str);
boolean continu = true;
new ThreadClient(connexion, str).start();
while (true) {

String ligne = clavier.readLine();
if (ligne.equalsIgnoreCase("quitter"))
{
sortie.println("quitter");

break;
}


if (ligne != null) sortie.println(ligne);
}
}
catch(IOException e) { System.out.println("Erreur : "+e); }
System.out.println("Connexion terminée...");
}
public String getName() {
return name;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public void setName(String name) {
this.name = name;
}
}

ThreadClient.java

package chattel;

import java.net.Socket;
import java.io.*;

public class ThreadClient extends Thread{

private Socket connexion;
private String pseudo;

public ThreadClient(Socket connexion, String pseudo) {
this.connexion = connexion;
this.pseudo = pseudo;
System.out.println("Nouveau socket : " + connexion);


}

public void run() {
try {


boolean continuer = true;
while (continuer) {
BufferedReader entree = new BufferedReader(new InputStreamReader(
connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);

String ligne = entree.readLine();

if (ligne == null) {
continuer = false;
}

if (ligne != null) System.out.println(ligne);



}
connexion.close();
}

catch (IOException e) {
System.err.println(e);

}

}


}


Serveur.java

package chattel;
import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.Iterator;

public class Serveur {

private static final int PORT = 36000;
private static int numero = 1;
public static Vector mesClients = new Vector();
private static Serveur monServeur;

public void insererClient(Client client) {

this.mesClients.add(client);
}

public void retirerClient(Client client) {

this.mesClients.remove(client);
}


public static Serveur getInstance() {
if (null == monServeur) {
monServeur = new Serveur();
}
return monServeur;
}

public static void envoieATous(String chaine) throws IOException {
Iterator iterator = mesClients.iterator();

while (iterator.hasNext()) {

Client ceClient=(Client)iterator.next();

PrintWriter tmpout = new PrintWriter(((ceClient).getSocket()).getOutputStream(), true);
tmpout.println(chaine);
}

}

public static void main(String[] args) throws Exception {

Serveur monServeur = Serveur.getInstance();

try {
ServerSocket service = new ServerSocket(PORT);

while (true) {
Socket connexion = service.accept();
BufferedReader entree = new BufferedReader(new InputStreamReader(
connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
String ligne = entree.readLine();
if (ligne.startsWith("Nouveau client")) {
String pseudo = ligne.substring(14);

System.out.println("Arrivee de " + pseudo + ".");
sortie.println("Bonjour et bienvenu sur le ChatTEL");
monServeur.envoieATous("Arrivee de " + pseudo + ".");
Client monClient=new Client(connexion,pseudo);
monServeur.insererClient(monClient);

new ThreadServeur(connexion, pseudo, monClient).start();

}

}


}
catch (IOException e) {
System.out.println("Erreur : " + e);

}

}

}


ThreadServeur.java

package chattel;

import java.io.*;
import java.net.Socket;

class ThreadServeur extends Thread
{

private Socket connexion;
private String pseudo;
private Client client;

public ThreadServeur(Socket connexion, String pseudo, Client monClient){
this.connexion = connexion;
this.pseudo = pseudo;
this.client=monClient;
System.out.println("Nouveau socket : " + connexion);

}

public void run() {
try {


boolean continuer = true;
while (continuer) {
BufferedReader entree = new BufferedReader(new InputStreamReader(
connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);

String ligne = entree.readLine();

if (ligne.equalsIgnoreCase("quitter")){
Serveur.mesClients.remove(this.client);
Serveur.envoieATous(pseudo+" a quitter le chat");
System.out.println(pseudo+"a quitter le chat");


break;
}


if (ligne == null) {
continuer = false;
}
else {

String chaine=pseudo + " > " + ligne;
System.out.println(chaine);
Serveur.envoieATous(chaine);

}


}
connexion.close();
}

catch (IOException e) {
System.err.println(e);

}

}
}

merci d'avance

je tiens à signaler que je doit faire tout ça dans une interface graphique, donc si vous avez des tutoriels pour ça merci de me les envoyer. :D




Hors ligne NeoZer0 # Posté le 04/07/2008 à 20:43:44
Nostalgeek
Avatar
Groupe : Membres
j'ai pas vraiment regarder ton code parce que tu n'as pas utiliser la balise code.
mais je peux te proposer ceci http://defaut.developpez.com/tutoriel/ [...] /multithread/ ça te permettra de te faire une idée de comment partir car en survolant j'ai vu qu'il risquer d'y avoir certain soucis car par exemple ta méthode d'ajout de client n'est pas synchroniser donc risque de conflits.

n'oubliez pas de Image utilisateur ;)
Un code php commence par <?php et fini par ?> ne l'oublier pas dans le zCode
 
Hors ligne daedric # Posté le 05/07/2008 à 18:01:12
Groupe : Membres
ne fais pas de communication inter client ... fais tout passer par le serveur
et c'est le serveur qui achemine a chaque client les messages qui leurs sont destine

j'ai un code qui se balade dans mon pc mais je suis un peu reticent a te le donner

"n'est pas mort ce qui semble a jamais dormir et en d'étranges temps même la mort peut mourrir"
 
Hors ligne meryazer # Posté le 08/07/2008 à 16:11:57
Avatar
Groupe : Membres
bonjour, merci pour vos réponse, oui vous avez raison le serveur ne fait que faire communiquer les clients entre eux,pour l'instant j'ai fait l'interface de client, et le serveur envoie pren chaque message d'un client et l'envoie à tous les autres clients.
le probleme c'est que chaque client doit s'authentifier avant de se connecter et pour cela j'ai essayé de lier mon programme à ma base de donnée pour voir si le pseudo tapé existe déja ou non, et normalement aprés vérification le serveur doit donner une valeur à pseudo, cette valeur se trouve sur le TextField de la fenetre d'authentification, bon puisque je voulez juste voir si le code marche j'ai initialisé le pseudo par "Amal", mais moi je veux à chaque fois avoir un client different,
désolé mon message est trés long mais j'essai de bien expliquer mon prob :)
voici les code:

Serveur.java

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package ProjetChat;

import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.Iterator;

public class Serveur {
	
private static final int PORT = 36000;
private static int numero = 1;
public static Vector mesClients = new Vector();
private static Serveur monServeur;

//methode pour ajouter des clients
public void insererClient(Client client) {

this.mesClients.add(client);
}

//methode pour supprimer des clients
public void retirerClient(Client client) {

this.mesClients.remove(client);
}


public static Serveur getInstance() {
if (null == monServeur) {
monServeur = new Serveur();
}
return monServeur;
}

//methode pour envoyer à tt le monde
public static void envoieATous(String chaine) throws IOException {
Iterator iterator = mesClients.iterator();

while (iterator.hasNext()) {

Client ceClient=(Client)iterator.next();

PrintWriter tmpout = new PrintWriter(((ceClient).getSocket()).getOutputStream(), true);
tmpout.println(chaine);
}

}



public static void main(String[] args) throws Exception {

Serveur monServeur = Serveur.getInstance();

try {
ServerSocket service = new ServerSocket(PORT);

while (true) {
Socket connexion = service.accept();
BufferedReader entree = new BufferedReader(new InputStreamReader(
connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);


BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));
FenetreAuthent fenetreauthent=new FenetreAuthent();

//** String pseudo=fenetreauthent.getTextField().getText();
//** String pseudo=entree.readLine();
// Là peut etre je doit metre le code concernant la connexion ,les buffer..
// avan la fenetre d'authentification

String pseudo="Amal";

FenetreClient fenetre = new FenetreClient();

String ligne = entree.readLine();


//ceation d'une instance de type client
Client monClient=new Client(connexion,pseudo);
//ajoueter le client qui vient de se connecter
monServeur.insererClient(monClient);
monServeur.envoieATous(pseudo+" a rejoint le chat");
// fenetre.getArea().append("Nouveau socket : " + connexion.toString());


new ThreadServeur(connexion, pseudo,/*fenetre,*/ monClient).start();

}

}
//les exeptions
catch (IOException e) {
System.out.println("Erreur : " + e);
}
}
}


ThreadServeur.java

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package ProjetChat;

import java.io.*;
import java.util.*;
import java.net.Socket;

class ThreadServeur extends Thread
{
//les propriétés
private Socket connexion;
private String pseudo;
private Client client;

private static Serveur monServeur;

//le constructeur
public ThreadServeur(Socket connexion, String pseudo, Client monClient){
this.connexion = connexion;
this.pseudo = pseudo;
this.client=monClient;



}

public void run() {
try {



boolean continuer = true;
while (continuer) {
BufferedReader entree = new BufferedReader(new InputStreamReader(
connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);

BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));


//lecture du message du client
String ligne = entree.readLine();

//si le client ecrit "quitter" alors le seveur se charge de le suprimer et d'indiquer
//aux autres clients qu'il a quitté le chat

if (ligne.equalsIgnoreCase("quitter")){
monServeur.mesClients.remove(this.client);
monServeur.envoieATous(pseudo+" a quitter le chat");
System.out.println(pseudo+"a quitter le chat");


break;
}


if (ligne == null) {
continuer = false;
}

//le serveur envoie à tous les clients le message envoyé par un d'eux
else {

String chaine=pseudo + " > " + ligne;
monServeur.envoieATous(chaine);

}

}
connexion.close();
}

catch (IOException e) {
System.err.println(e);

}

}
}


FenetreAuthent.java

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package ProjetChat;

import java.awt.*;
import javax.swing.*;



public class FenetreAuthent extends JFrame
{
    
    private JTextField texte;
    public JButton envoyer;

    public  FenetreAuthent() {
        super();
        build();
        
    }
    
    private void build()
    {
        
        setSize(200,100);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ContenuTexte().setLocation(0,15);
        getContentPane().add("North", ContenuTexte());
        getContentPane().add("South", ContenuBouton());
        
        
    }
    

    private JPanel ContenuTexte()
    {
        
        JPanel contenu =new JPanel();
        contenu.setLayout(new FlowLayout());
        
        texte = new JTextField();
        texte.setColumns(10);
        
        
        contenu.add(texte);
        
        return contenu;
        
    }

    
    private JPanel ContenuBouton()
    {
        
        JPanel contenu =new JPanel();
        
        envoyer = new JButton("Envoyer");
        contenu.add(envoyer);
        
        return contenu;
    }
    
    public JTextField getTextField()
    {
	return texte;
    }

    
    public JButton getButton()
    {
        return envoyer;
    }
    
}


FenetreClient.java

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package ProjetChat;

import java.awt.*;
import javax.swing.*;


public class FenetreClient extends JFrame
{
    
    private JTextField texte;
    private JTextArea chat;
    public JButton envoyer;

    public  FenetreClient() {
        super();
        build();
        
    }
    
    private void build()
    {
        
        setSize(600,285);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add("North", ContenuFenetre());
        getContentPane().add("West", ContenuTexte());
        getContentPane().add("East", ContenuBouton());
        
        
    }
    
    private JPanel ContenuFenetre()
    {
        chat = new JTextArea(10,40);
        chat.setLineWrap(true);
                
        JScrollPane scrool = new JScrollPane(chat);
        JPanel contenu =new JPanel();
        contenu.setLayout(new FlowLayout());
       
        contenu.add(scrool);
               
        return contenu;
        
    }
    
    private JPanel ContenuTexte()
    {
        
        JPanel contenu =new JPanel();
        contenu.setLayout(new FlowLayout());
        
        texte = new JTextField();
        texte.setColumns(40);
        contenu.add(texte);
        
        return contenu;
        
    }
    
    private JPanel ContenuBouton()
    {
        
        JPanel contenu =new JPanel();
        
        envoyer = new JButton("Envoyer");
        contenu.add(envoyer);
        
        return contenu;
    }
    
    public JTextField getTextField()
    {
	return texte;
    }
	
    public JTextArea getArea()
    {
	return chat;
    }
    
    public JButton getButton()
    {
        return envoyer;
    }
}


voici le code de Client.java c'est dans ce code que j'essai de faire la liaison avec la base de données
normalement j'ai lancer la requette avant le click du bouton de la fenetre d'authentification, et lors du click la verification commence

Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package ProjetChat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
//
import java.sql.*;

public class Client {
    public int id_client;
    public String login_client;
    public Socket socket;
    static String ligne;
    static public FenetreClient fenetre;
    static public FenetreAuthent fenetreauthent;
    static private PrintWriter sortie;
    static private boolean continu;
    static String pseudo;
    
  
   //*** boolean n=new boolean(true);
    
    public Client(Socket s, String n)
    {
        this.socket=s;
        this.login_client=n;
    }
    
    
    public static void main(String  args[]) throws Exception
    {
    	//*** 
    	String pilote = "com.mysql.jdbc.Driver";
         try
         {
         
                ////////////////////////////////////////////////////
                //   AUTHENTIFICATION //////////////////////////////
                ////////////////////////////////////////////////////
 
                fenetreauthent = new FenetreAuthent(); 
                fenetreauthent.setVisible(true);
                
          	//Chargement de mon pilote
 
			Class.forName(pilote);
			//Connexion à ma base mysql avec le login root et sans mot de passe
			
			Connection connexionn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","");
			//Création de mon statement qui va me permettre d'executer mes requetes
		
			Statement instruction = connexionn.createStatement();
	    	//La table s'appelle personne
	    	//cette table contient : id ,login et password, pour l'instant je ne vais traiter que le login
                
             ResultSet resultat = instruction.executeQuery("SELECT * FROM personne");
                  fenetreauthent.getButton().addActionListener(new ActionListener() 
                 {  
                      public void actionPerformed(ActionEvent e)   
                       {
                 	
                        String ad = fenetreauthent.getTextField().getText();
		             	while (resultat.next())
		                   	{
			                  	String log=resultat.getString("login");
				                if(ad.equalsIgnoreCase(log)) 
		                        	{ 
		                                  String pseudo=log;
		    //** n=false; 
		                         	}
		                 	}
                      fenetreauthent.dispose();      
                    }
               }); 
         
                
                ////////////////////////////////////////////////////
                //////// CHAT //////////////////////////////////////
                ////////////////////////////////////////////////////
                
                
  // dans la ligne qui suit vous remarquer String pseudo="Amal" , parce que je le rend
  //visible seulement pour que le code marche, mais là je doit suprimer la partie d'authentification
   
               //** String pseudo="Amal";
                fenetre = new FenetreClient();
                fenetre.setVisible(true);
                Socket connexion = new Socket("127.0.0.1", 36000);
                sortie = new PrintWriter(connexion.getOutputStream(), true);
                sortie.println("Nouveau client "+pseudo);
                continu = true;
                new ThreadClient(connexion, pseudo, fenetre).start();
                fenetre.getButton().addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                    {
                        ligne = fenetre.getTextField().getText();
                        fenetre.getTextField().setText("");
                        if (ligne.equalsIgnoreCase("quitter")) fenetre.dispose();
                        sortie.println(ligne);
                    }
                }); 
         }
          catch(IOException e) { System.out.println("Erreur : "+e+".\r\n"); }
     }
     
     public void setSocket(Socket socket)
     {
         this.socket = socket;
     }
     public Socket getSocket()
     {
         return socket;
     }
}


bon voila , si vous voulez essayer le code tachez de lire les commentaires pour comprendre là démarche.
N.B:j'ai installer le pilote pour mysql
merci pour votre patience
:)
Hors ligne NeoZer0 # Posté le 09/07/2008 à 11:10:43
Nostalgeek
Avatar
Groupe : Membres
Sans regarder en profondeur le code juste en lisant ton problème, j'ai deux choses à dire:
  • C'est pas très sécuriser de mettre des informations de connexion à une base de donnée du coté du client.
    Deux raisons:
    • Java est très facilement "décompilable". Même si ton code est obfusquer c'est pas terrible
    • Si par exemple un jour la database change ce n'est plus du mysql. Tous les clients doivent être changer. Alors que si tu fais ça coté serveur tu change le serveur et c'est tout

  • Je m'aperçois que tu n'as pas de protocole de communication. Cela pourais s'avérer utile rien que pour gérer les authentifications mais aussi ceci permettrait d'ajouter des fonctions (envoi de fichier, envoi à certaine personne, lister les personnes connectée...)
Édité le 09/07/2008 à 11:12:25 par NeoZer0

n'oubliez pas de Image utilisateur ;)
Un code php commence par <?php et fini par ?> ne l'oublier pas dans le zCode
 
Hors ligne meryazer # Posté le 10/07/2008 à 10:43:12
Avatar
Groupe : Membres
bonjour merci beaucoup pour ta réponse , tu as tout à fait raison, la liaison avec la base de données doit se faire au niveau serveur, mais je ne sait pas comment faire, pour l'instant j'ai réussi à la lier avec le client, car les requettes se font lorsqu'on click sur le bouton "connexion" de la fenetre d'authentification, comment je peux faire en sorte que le serveur sache quand est ce que le client a cliqué ce bouton? càd est ce que j'ai le serveur a droit de faire appel à des listner concernant des fenetres pour client?
j'ai pas bien compris comment je vais définir un protocole de communication?
pardonne moi, je suis plus que nulle :euh: et je veux aprendre :D
merci d'avance
Hors ligne NeoZer0 # Posté le 17/07/2008 à 19:59:37
Nostalgeek
Avatar
Groupe : Membres
Désoler pour le retard mais j'avais pas trop de temps. J'ai essayé de chercher un code que j'avais pour te donner un exemple mais impossible de remettre la main dessus.

Documente toi sur internet sur ce qu'est un protocole de communication. Après il y en a qui existe déjà et dont tu peux t'inspirer. Je pense notamment à Jabber mais qui risque d'être un peu lourd pour ton petit projet.

Désoler de pas pouvoir t'aider plus. Mais bon en même temps c'est ton projet donc faut bien que tu le fasse ;). Bon courage si tu as d'autres questions j'y répondrais.

n'oubliez pas de Image utilisateur ;)
Un code php commence par <?php et fini par ?> ne l'oublier pas dans le zCode
 

Retour au forum "Langage Java" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 162 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1068s (0.0916s)