probleme de cast :!

probleme de cast :! - Java - Programmation

Marsh Posté le 07-07-2004 à 18:51:04    

voila je suis en train de développer un chat en java
1 client = 1 thread
je cherche le moyen de d'envoyer un message à tous les clients
je répertorie tous les threads dans un threadgroup  
 
mais à la ligne de code en rouge il me met une erreur :
Cannot cast from Thread to server.connexion
 
comment faire pour attribuer la méthode toClient ( un outputstream ) à un thread ?
 
voici un bou du code
 
Thread[] threads = new Thread[tg.activeCount()];  
   int nbThread = tg.enumerate(threads);  
     
   if (clientDest == "public" ) // envoie du message public
   {
    for (int i=0;i<threads.length;i++)
    {
     try
     {
      ( (connexion) threads[i] ).toClient.println(clientDest);
      ( (connexion) threads[i] ).toClient.println(message);
    }
     catch (IOException ex1)  
     {  
      // Envois du message imépossible à ce client, Next-One  
     }  
    }
   }

Reply

Marsh Posté le 07-07-2004 à 18:51:04   

Reply

Marsh Posté le 07-07-2004 à 19:17:07    

on ne voit pas du tout la partie ou tu insere les instances de ta classe connexion dans ton tableau threads...

Reply

Marsh Posté le 08-07-2004 à 16:13:49    

une remarque sur ton code :
 - les conventions java veulent qu'un nom de classe commence par une majuscule
 - les attributs de classe public c'est mal :o
 - le == ne doit être utilisé qu'avec les types promitifs (int, char, etc ...) ou pour tester que deux variables pointent le même objet. Pour tester l'égalité de 2 objets il faut utiliser equals :

Code :
  1. if (clientDest.equals("public" ))


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

Marsh Posté le 10-07-2004 à 14:58:10    

merci benou pour les infos .. je suis desole je debute en java ...
sinon la partie ou j'instance la class connexion ds mon tableau de thread ?
 
---------- voici mon code .. je sais ca ne se fait pas mais je veux comprendre -------------------------------
 
public class server  
{
 int port;
 ServerSocket server;
 Socket socket;
 String[] noms = new String [100];
 ThreadGroup tg;  
 
 
 public server() throws Exception
 {
  noms[0]="ln"; // identifie noms à la liste des noms
  noms[1]="fln"; // fin de liste de noms
  port = 5550;
  server = new ServerSocket(port);
  tg = new ThreadGroup("Clients" );
   
  System.out.println("Le serveur attend une connexion" );
  for (;;)  
  {  
   socket = server.accept();
   System.out.println("le serveur à recu et accepte la connexion venant de " + socket);  
   connexion c = new connexion(port,socket);
  }  
   
 }
 
 class connexion implements Runnable  
 {
   
  int port;
  Socket socket;
        public DataInputStream fromClient;
        public PrintStream toClient;
        public Thread t;
         
   
  public connexion(int p, Socket s)  
  {
   this.port = p;
   this.socket = s;
   
   System.out.println("Attente d'une information" );
   try  
   {
    fromClient =  new DataInputStream(socket.getInputStream());
             toClient = new PrintStream(socket.getOutputStream());
             System.out.println("Nouvelle connexion au client : " + socket.getLocalAddress());
   
             t = new Thread(tg,this,"Thread client" );
             t.start();
   }  
            catch (IOException e)  
   {
                try { socket.close(); } catch (IOException ee) {}
            }
             
             
        }
       
        public void run()
  {
   String nom;
   String lettre;
   String line;
   String client_dest,client_source;
   
   try  
   {
    fromClient =  new DataInputStream(socket.getInputStream());
    toClient = new PrintStream(socket.getOutputStream());
             System.out.println("Nouvelle connexion au client : " + socket.getLocalAddress());
     
             toClient.println("mBienvenue sur le chat E_Learning" );
                 
                while ((line = fromClient.readLine()) != null)  
                {
                 System.out.println("line = "+line);
                 
                 lettre=line.substring(0,1);
             
                 if ((lettre.compareTo("m" ))==0) // m=message
                 {
                  client_source = fromClient.readLine();
                  client_dest = fromClient.readLine();
                  line=fromClient.readLine();
 
                  envoyer_message_client(client_source,client_dest,line);
                  sendList();
                 }
                 else if ((lettre.compareTo("a" ))==0) // a = ajouter nom
                 {
                  ajouter_ListeClient(line.substring(1));
                  this.t.setName(line.substring(1));
                  sendList();
                 }
                 else if (lettre.compareTo("q" )==0) // q=quit
                 {
                  stop();
                  //supprimer_ListeClient(fromClient.);
                 }
                 else if (lettre.compareTo("s" )==0) // s=server
                 {
                  System.out.println(line.substring(1));
                 }
                 else
                 {
                  toClient.println("Erreur, première lettre non reconnue" );
                 }
                     
                }
                toClient.println("message : bye !" );
   }
   catch (IOException e)  
   {
                System.out.println("Exception entree/sortie : "+e.getMessage());
            }
            stop();
  }
         
         
  public void envoyer_message_client(String clientSource,String clientDest, String message)
  {
   toClient.println("m" );
   
   Thread[] threads = new Thread[tg.activeCount()];  
   int nbThread = tg.enumerate(threads);  
     
   if (clientDest.equals("public" )) // envoie du message public
   {
    for (int i=0;i<threads.length;i++)
    {
     try
     {
      ( (connexion) threads[i] ).toClient.println(clientDest);
      ( (connexion) threads[i] ).toClient.println(message);
     }
     catch (IOException ex1)  
     {  
      // Envois du message imépossible à ce client, Next-One  
     }  
    }
   }
   else // envoie du message privé
   {
    for (int i=0;i<threads.length;i++)
    {
     try
     {
      if (threads[i].getName()==clientDest)
      {
       ( (connexion) threads[i] ).toClient.println(clientDest);
       ( (connexion) threads[i] ).toClient.println(clientSource);
       ( (connexion) threads[i] ).toClient.println(message);
      }
     }
     catch (IOException ex1)  
     {  
      // Envois du message imépossible à ce client, Next-One  
     }  
    }
   }
   
   /*
    Thread[] threads = new Thread[threadGroup.activeCount()];  
    int nbThread = threadGroup.enumerate(threads);  
 
   for (int i = 0; i < threads.length; i++) {  
   try {  
    if( (event.getDest() != null && threads[i].getName().equals(event.getDest())) || event.getDest() == null )  
     ( (ServerDeamon) threads[i]).out.writeObject(event);  
     }  
     catch (IOException ex1) {  
     // Envois du message impossible à ce client, Next-One  
      }  
      }  
 
voila vous avez tout ...

Reply

Marsh Posté le 10-07-2004 à 15:20:54    

benou a écrit :

Code :
  1. if (clientDest.equals("public" ))


boom si clientDest est null ... "public".equals(clientDest) est plut sur

Reply

Marsh Posté le 10-07-2004 à 15:23:14    

ok merci .. c plus logic c vrai ;)

Reply

Marsh Posté le 10-07-2004 à 15:34:15    

Taz a écrit :

boom si clientDest est null ... "public".equals(clientDest) est plut sur


je sais bien mais j'aime pas cette syntaxe ... elle se lit pas de façon logique (je trouve).
 
Et faire ce genre de truc c'est passer à côté du cas où la valeur est null (et qui nécessite souvent un traitement particulier).
 
Bref, c'est une facilité d'écriture que je n'utilise pas ...

Reply

Marsh Posté le 10-07-2004 à 15:45:45    

moi aussi j'aurais aimé un operator==

Reply

Sujets relatifs:

Leave a Replay

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