probleme de cast :! - Java - Programmation
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...
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
- 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 :
|
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 ...
Marsh Posté le 10-07-2004 à 15:20:54
benou a écrit :
|
boom si clientDest est null ... "public".equals(clientDest) est plut sur
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 ...
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
}
}
}