Communication entre threads [Résolu & Code Source Final]

Communication entre threads [Résolu & Code Source Final] - Java - Programmation

Marsh Posté le 20-01-2005 à 18:22:51    

Bonjour, je suis en train de faire une sorte de logiciel de communication entre plusieurs pc. J'ai donc créé la classe Server qui ecoute sur un port et créer des threads dès qu'un client se connecte. Pour l'instant ca va, le serveur affiche les messages reçu dans la fenetre de log. Le problème, c'est comment faire pour l'envoyer à tous les autres clients? car je ne vois pas comment passer un élément du thread au programme serveur (celui qui a créer la thread)... Si quelqu'un a la solution ou une idée algo pour m'aider, ca serait sympa :)
 
merci , loiklo


Message édité par loiklo le 21-01-2005 à 08:26:12
Reply

Marsh Posté le 20-01-2005 à 18:22:51   

Reply

Marsh Posté le 20-01-2005 à 19:34:27    

J'ai eu le meme souci:
http://forum.hardware.fr/hardwaref [...] 3146-1.htm
 
Je parle pas java, mais l'idée doit être la même.


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 19:44:17    

hum, nan, ca m'aide pas trop, en faite si on compare au processus UNIX, j'aimerais parler au père... Voiçi le code si ca peut vous aider à comprendre.
 
 
Voici le serveur:
 

Code :
  1. Voir plus bas dans le message, le code corigé


 
La connexion se passe par l'envoi d'instance de la classe String avec le message à l'interieur (je pense passer une classe perso plus tard avec un pseudo et le message, enfin bon...)
En faite, quand un thread recçois une instance de la classe String, il doit l'envoyer au père, et le père doit l'envoyer à tous ses threads. (Pour l'envoi, je sais comment faire, un vecteur de thread et hop c'est bon) mais pour passer cette String au père je vois pas du tout comment faire...


Message édité par loiklo le 21-01-2005 à 08:27:21
Reply

Marsh Posté le 20-01-2005 à 19:50:25    

il faut que tu enregistres tes ListenThread dans une collection au niveau du serveur et que tu passes une référence du serveur lors de la construction di listenthread.
=> quand depuis le ListenThread tu veux balacner un message au serveur, tu appelles une méthode sur le serveur qui feras une boucle sur tous les clients pour envoyer le message.
 
(attention à la synchronisation de la collection)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-01-2005 à 19:50:34    

Reply

Marsh Posté le 20-01-2005 à 19:59:38    

J'avais lu l'autre topic déjà. Il faut que je passe par référence, mais il me semblait qu'il n'y avait pas de pointeur en java?! Avec mes (faibles) connaissances, je comprends qu'il faudrait que je fasse par exemple:
 
new ListenThread(connection, this);
 
et que ListenThread attende un ServerSocket en paramètre a l'instanciation et ensuite je crée un méthode qui 'for each' ListenThread execute la methode d'envoi du message?
 
ai-je bien compris ?

Reply

Marsh Posté le 20-01-2005 à 20:09:09    

tout à fait.
 
et c'est pas qu'il n'y a pas de pointeur en java, c'est que tu ne les manipules pas directement. En fait, toutes les variables d'objetsont des pointeurs...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-01-2005 à 20:11:57    

hum oki! j'aurais appris quelquechose today :)
 
et bien je te remercie grandement car je ne voyais pas du tout comment faire :)

Reply

Marsh Posté le 21-01-2005 à 08:23:54    

Le problème étant résolu, voilà mon résultat, il y a plein de problème mais la connection/déconnection fonctionne correctement.
Le code de l'interface a été généré avec NetBeans donc pas forcement optimisé. Un autre problème est quand on ferme le serveur, il se cache uniquement et reste dans la liste des processus. Il faut aussi mettre les bon import car la j'ai mis * pour pas avoir à m'y soucier.
 
(Je ne demande pas de solution aux problème, c'est juste si ca peut servir de base à certain)
 
//--------------------------------------------
//ListenServer.java
//--------------------------------------------

Code :
  1. import java.net.ServerSocket;
  2. import java.net.Socket;
  3. import java.io.IOException;
  4. import java.util.Vector;
  5. class ListenServer{
  6.     ServerSocket listenSocket;
  7.     int port;
  8.     Socket connection;
  9.     Vector vecThread;
  10.     ListenServer(int p){
  11.         super();
  12.         port = p;
  13.         vecThread = new Vector();
  14.     }
  15.     public void run(){
  16.         try{
  17.             listenSocket = new ServerSocket(port);
  18.             while(true){
  19.                 Socket connection = listenSocket.accept();
  20.                 vecThread.add(new ListenThread(connection, this));
  21.             }
  22.         }catch(IOException e){
  23.             System.out.println("ListenSocket IOException: " );
  24.             e.printStackTrace();
  25.         }
  26.     }
  27.    
  28.     public boolean sendMessage(String message){
  29.         ListenThread tmp;
  30.         for (int i=0; i<vecThread.size(); i++){
  31.             tmp = (ListenThread)vecThread.elementAt(i);
  32.             tmp.send(message);
  33.         }
  34.         return true;
  35.     }
  36.    
  37.     public void clientExit(ListenThread client){
  38.         int find = vecThread.indexOf(client);
  39.         vecThread.removeElementAt(find);
  40.         client.destroy();
  41.     }
  42.     public static void main(String argv[]){
  43.         ListenServer server;
  44.         if(argv.length==1) server = new ListenServer(Integer.parseInt(argv[1]));
  45.         else server = new ListenServer(6667);
  46.         server.run();
  47.     }
  48. }


 
 
 
 
//--------------------------------------------
//ListenThread.java
//--------------------------------------------

Code :
  1. import java.net.Socket;
  2. import java.io.ObjectInputStream;
  3. import java.io.ObjectOutputStream;
  4. import java.io.EOFException;
  5. import java.io.IOException;
  6. class ListenThread extends Thread{
  7.     Socket connection;
  8.     ObjectInputStream in;
  9.     ObjectOutputStream out;
  10.     String message;
  11.     ListenServer server;
  12.     ListenThread(Socket socket, ListenServer serv){
  13.         super();
  14.         connection = socket;
  15.         server = serv;
  16.         System.out.println("Thread creee" );
  17.         this.start();
  18.     }
  19.    
  20.     public void send(String message){
  21.         try{
  22.             out.writeObject(message);
  23.         }catch(IOException e){
  24.             System.out.println(e);
  25.         }
  26.     }
  27.    
  28.     public void destroy(){
  29.         try{
  30.             out.close();
  31.             in.close();
  32.         }catch(IOException e){System.out.println(e);}
  33.         System.out.println("Thread detruite" );
  34.     }
  35.     public void run(){
  36.         try{
  37.             out = new ObjectOutputStream(connection.getOutputStream());
  38.             in = new ObjectInputStream(connection.getInputStream());
  39.             while(true){
  40.                 try{
  41.                     message = (String) in.readObject();
  42.                 }catch(java.lang.ClassNotFoundException e){
  43.                     System.out.println(e);
  44.                 }
  45.                 System.out.println("Thread: "+message);
  46.                 server.sendMessage(message);
  47.             }
  48.         }catch(EOFException e){
  49.             try{
  50.                 connection.close();
  51.                 System.out.println("ListenThread: EOFException, client deconecte" );
  52.                 return;
  53.             }catch(IOException ee){
  54.                 System.out.println("ListenThread: IOException, client deconecte" );
  55.                 ee.printStackTrace();
  56.                 return;
  57.             }
  58.         }catch(IOException e){
  59.             System.out.println("ListenThread: IOException" );
  60.             server.clientExit(this);
  61.             e.printStackTrace();
  62.             return;
  63.         }
  64.     }
  65. }


 
 
 
 
//--------------------------------------------
//Client.java
//--------------------------------------------

Code :
  1. import java.awt.event.ActionEvent;
  2. import java.net.Socket;
  3. import java.io.*;
  4. public class Client extends javax.swing.JFrame {
  5.     Socket sok;
  6.     String message;
  7.     ObjectOutputStream out;
  8.     ObjectInputStream in;
  9.    
  10.     public Client(Socket sokk) {
  11.         initComponents();
  12.         sok = sokk;
  13.         try{
  14.             System.out.println("1" );
  15.             out = new ObjectOutputStream(sok.getOutputStream());
  16.             System.out.println("1" );
  17.             in = new ObjectInputStream(sok.getInputStream());
  18.             System.out.println("1" );
  19.         }catch(Exception e){};
  20.         System.out.println("1" );
  21.         this.setVisible(true);
  22.         System.out.println("1" );
  23.         run();
  24.     }   
  25.    
  26.     public void run(){
  27.         while(true){
  28.             try{
  29.                 message = (String) in.readObject();
  30.             }catch(IOException e){
  31.                 System.out.println(e);
  32.             }catch(ClassNotFoundException e){
  33.                 System.out.println(e);
  34.             }
  35.             affMess.setText(affMess.getText()+message);
  36.         }
  37.        
  38.     }
  39.    
  40.     /** This method is called from within the constructor to
  41.      * initialize the form.
  42.      * WARNING: Do NOT modify this code. The content of this method is
  43.      * always regenerated by the Form Editor.
  44.      */
  45.     private void initComponents() {                         
  46.         jScrollPane1 = new javax.swing.JScrollPane();
  47.         affMess = new javax.swing.JTextPane();
  48.         tfMess = new javax.swing.JTextField();
  49.         tfPseudo = new javax.swing.JTextField();
  50.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  51.         jScrollPane1.setViewportView(affMess);
  52.         getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
  53.         tfMess.setText("jTextField1" );
  54.         tfMess.addActionListener(new java.awt.event.ActionListener() {
  55.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  56.                 tfMessActionPerformed(evt);
  57.             }
  58.         });
  59.         getContentPane().add(tfMess, java.awt.BorderLayout.SOUTH);
  60.         tfPseudo.setText("Pseudo" );
  61.         tfPseudo.addActionListener(new java.awt.event.ActionListener() {
  62.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  63.                 tfPseudoActionPerformed(evt);
  64.             }
  65.         });
  66.         getContentPane().add(tfPseudo, java.awt.BorderLayout.NORTH);
  67.         pack();
  68.     }                       
  69.     private void tfPseudoActionPerformed(java.awt.event.ActionEvent evt) {                                       
  70.         // TODO add your handling code here:
  71.     }                                       
  72.     private void tfMessActionPerformed(java.awt.event.ActionEvent evt) {                                     
  73.         str = tfMess.getText();
  74.         try{
  75.             out.writeObject(str);
  76.         }catch(IOException e){}
  77.         tfMess.setText("" );
  78.     }                                     
  79.    
  80.     public static void main(String args[]) {
  81.         Socket sokkk;
  82.        
  83.         try{
  84.             sokkk = new Socket("192.168.0.26",6667);
  85.             new Client(sokkk);
  86.         }catch(Exception e){
  87.             System.out.println(e);
  88.         }
  89.        
  90.     }
  91.    
  92.     private String str;
  93.     // Variables declaration - do not modify                     
  94.     private javax.swing.JTextPane affMess;
  95.     private javax.swing.JScrollPane jScrollPane1;
  96.     private javax.swing.JTextField tfMess;
  97.     private javax.swing.JTextField tfPseudo;
  98.     // End of variables declaration                   
  99.    
  100. }


Reply

Marsh Posté le 21-01-2005 à 08:40:17    

benou a écrit :

tout à fait.
 
et c'est pas qu'il n'y a pas de pointeur en java, c'est que tu ne les manipules pas directement. En fait, toutes les variables d'objetsont des pointeurs...


des references plutot ...

Reply

Marsh Posté le 21-01-2005 à 08:40:17   

Reply

Marsh Posté le 21-01-2005 à 11:25:35    

et c'est quoi une référence si ce n'est l'adresse mémoire où les données de l'objet sont stockées [:petrus75]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-01-2005 à 11:51:31    

benou a écrit :

et c'est quoi une référence si ce n'est l'adresse mémoire où les données de l'objet sont stockées [:petrus75]


une chose est sure, c'est pas un pointeur [:petrus75]

Reply

Marsh Posté le 21-01-2005 à 12:04:24    

[:popcorn]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed