Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1390 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°957718
loiklo
Posté le 20-01-2005 à 18:22:51  profilanswer
 

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
mood
Publicité
Posté le 20-01-2005 à 18:22:51  profilanswer
 

n°957747
Bleuarff
pouet
Posté le 20-01-2005 à 19:34:27  profilanswer
 

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.
n°957753
loiklo
Posté le 20-01-2005 à 19:44:17  profilanswer
 

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
n°957760
benou
Posté le 20-01-2005 à 19:50:25  profilanswer
 

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
n°957761
benou
Posté le 20-01-2005 à 19:50:34  profilanswer
 
n°957770
loiklo
Posté le 20-01-2005 à 19:59:38  profilanswer
 

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 ?

n°957778
benou
Posté le 20-01-2005 à 20:09:09  profilanswer
 

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
n°957780
loiklo
Posté le 20-01-2005 à 20:11:57  profilanswer
 

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

n°958214
loiklo
Posté le 21-01-2005 à 08:23:54  profilanswer
 

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. }


n°958218
beemer
Posté le 21-01-2005 à 08:40:17  profilanswer
 

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 ...

mood
Publicité
Posté le 21-01-2005 à 08:40:17  profilanswer
 

n°958298
benou
Posté le 21-01-2005 à 11:25:35  profilanswer
 

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
n°958316
beemer
Posté le 21-01-2005 à 11:51:31  profilanswer
 

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]

n°958338
the real m​oins moins
Posté le 21-01-2005 à 12:04:24  profilanswer
 

[:popcorn]


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[RESOLU] Fatal error: main() [function.main] - class php5Comment faire communiquer des threads ?
[VBS][résolu] imbriquer des "do while ... loop"?supprimer un objet d'un array [resolu]
un visual basic .net en open source images de rangs.. [RESOLU]
Màj config client ($_SESSION) si màj de config serveur (BDD) [RESOLU](resolu)include(pseudo frame) merci quand meme
[résolu]pb de droit sur fichier upload via script [merci!][resolu] resize d"une image après un upload....
Plus de sujets relatifs à : Communication entre threads [Résolu & Code Source Final]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR