[JAVA] Quelque difficulté à passer de C++ à Java

Quelque difficulté à passer de C++ à Java [JAVA] - Programmation

Marsh Posté le 05-03-2002 à 08:10:15    

Voilà je veux crée une array de 100 items, mais ne pas les instanciers automatiquement. en C++ je fais quelquechose du genre:
 

Code :
  1. Client *Clients[100];
  2. Clients[i] = new Client("127.0.0.1" );


 
Mais en java je ne peut pas car:
1) ya pas de pointeurs  :cry:  
2) une fois larray crée, tout les items sont instanciers  :pt1cable:  
 
Alors quelqu'un qui sy connait en JAVA pourait t'il m'aider? Ha oui, j'ai essayer d'utiliser un Vecteur, mais il me retourne un Object quand je fais vecteur.get() alors je peut pas les transformer en ma classe (client)??

 

[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 05-03-2002 à 08:10:15   

Reply

Marsh Posté le 05-03-2002 à 09:11:03    

Ventilo a écrit a écrit :

Voilà je veux crée une array de 100 items, mais ne pas les instanciers automatiquement. en C++ je fais quelquechose du genre:
 

Code :
  1. Client *Clients[100];
  2. Clients[i] = new Client("127.0.0.1" );


 
Mais en java je ne peut pas car:
1) ya pas de pointeurs  :cry:  
2) une fois larray crée, tout les items sont instanciers  :pt1cable:  
 
Alors quelqu'un qui sy connait en JAVA pourait t'il m'aider? Ha oui, j'ai essayer d'utiliser un Vecteur, mais il me retourne un Object quand je fais vecteur.get() alors je peut pas les transformer en ma classe (client)??  
 
 




 
Que veux tu dire par instancier automatiquement? En Java lorsque tu fais
 
Clients = new Client[100];
 
ca crée un tableau contenant 100 objets de type Client. Après tu peux faire
 
Clients[i]= ....
 
Je comprends pas où est ton problème. Pour le vecteur c'est parce que c'est un container générique et donc il prend des références d'objets en paramètres.
 
Pour récupérer ton client tu dois le downcaster au bon type, genre
 
Client c = (Client)v.getElementAt(i);
 
A+


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-03-2002 à 09:14:14    

bah.....
 
Client[] tableau = new Client[100];
 
et c'est tout.....
 
 
Sinon, avec un vecteur, il te retourne un objet car la propriété d'un vecteur est de contenir des objets de type différent...Si tu sais que tu n'as mis QUE des instances de la classe Client dedans, un cast suffit à récupérer un objet Client :
 
Client client = (Client) vecteur.get(i);
 
Si tu veux vraiment blinder le tout, tu faisd ça :
 
try {
   Client client = (Client) vecteur.get(i);
} catch (ClassCastException cce) {
   System.err.println("Grosse quiche, je veux des object Client dans mon vecteur!" );
}
 
:D

Reply

Marsh Posté le 05-03-2002 à 09:18:46    

Une semaine de vacances, j'ai perdu la main! bouhou!! :D

Reply

Marsh Posté le 05-03-2002 à 09:19:09    

prems :D

 

[jfdsdjhfuetppo]--Message édité par DarkLord--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-03-2002 à 10:02:16    

DarkLord a écrit a écrit :

prems :D  




peut être mais ca compile pas :  
 
Clients = new Client[100];  
 
c'est pas en mettant un 's' que Java comprend que c'est un tableau ;)

Reply

Marsh Posté le 05-03-2002 à 10:07:56    

hahaha!!! Et toceuuuuh!!! :D:D:D
 
Merci Benou!

Reply

Marsh Posté le 05-03-2002 à 10:30:52    

:D

Reply

Marsh Posté le 05-03-2002 à 12:07:06    

benou a écrit a écrit :

 
peut être mais ca compile pas :  
 
Clients = new Client[100];  
 
c'est pas en mettant un 's' que Java comprend que c'est un tableau ;)  




 
fuck off!  :fou:  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 :lol:  :lol:  :lol:  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 :hello:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-03-2002 à 13:31:27    

DarkLord a écrit a écrit :

 
fuck off!  :fou:  




 
:lol: :hello:

Reply

Marsh Posté le 05-03-2002 à 13:31:27   

Reply

Marsh Posté le 05-03-2002 à 20:56:52    

Je vais expliquer ce que je veux faire:
 
J'ai une classe Client qui est apeu près comme ca:

Code :
  1. class Client Extends Thread
  2. {
  3.    /*
  4.     ...
  5.    */
  6.    Socket csocket;
  7.    Client(Socket NouveauSocket)
  8.    {
  9.       //...
  10.       csocket = NouveauSocket;
  11.       //...
  12.    }
  13. }


 
pour crée un client je fait:

Code :
  1. Client nClient = new Client(serversocet.accept);


 
Donc si je veux plus d'un client il faut je le les mette dans un array style

Code :
  1. Client Clients[100]

, donc je ne peut pas faire

Code :
  1. Client Clients[100] = new Client(serversocket.accept)

parce qu'il essaie de me crée 100 clients sur le même socket  :crazy:
 
Ho et merci pour le cast de classes, je savais pas que l'on pouvait faire ca avec des classes autre que des types de base  :wahoo:

 

[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 05-03-2002 à 22:24:28    

On on dit « Client[] clients = new Client[100] » , pas Client « Clients[100] = new Client(serversocket.accept) » (ce qui est d'ailleurs incorrect, tu as un Array gauche et un Client à droite).
 
Ensuite seulement tu instancies tes Client : « clients[i] = new Client(serversocket.accept) ».

 

[jfdsdjhfuetppo]--Message édité par Matafan--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 05-03-2002 à 23:46:29    

Matafan a écrit a écrit :

On on dit « Client[] clients = new Client[100] » , pas Client « Clients[100] = new Client(serversocket.accept) » (ce qui est d'ailleurs incorrect, tu as un Array gauche et un Client à droite).
 
Ensuite seulement tu instancies tes Client : « clients[i] = new Client(serversocket.accept) ».  
 
 




 
Merci bien  :hello:  
j'avais mal compris  le principe des arrays :D
Je comprend pourquoi ca voulait pas compiler  :lol:

 

[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-03-2002 à 10:02:14    

pkoi créer un tableau de client ???
à chaque appel de accept() l'execution va être bloquée...  
 
Ce qu'il faut faire c'est une boucle qui "accepte" les connection, et qui créé un nouveau thread pour chaque connection d'un client

Reply

Marsh Posté le 06-03-2002 à 10:04:46    

benou a écrit a écrit :

pkoi créer un tableau de client ???
à chaque appel de accept() l'execution va être bloquée...  
 
Ce qu'il faut faire c'est une boucle qui "accepte" les connection, et qui créé un nouveau thread pour chaque connection d'un client  




 
il programmait en C++ avant, ceci doit expliquer cela


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 10:48:46    

Un Client est un Thread, donc en gros mon program est une boucle qui attend des conexion pendant que chaque client est géré par un thread...  
 
C'est pas ca qui faut faire??

Reply

Marsh Posté le 06-03-2002 à 10:58:35    

bin tu dois pas mettre ca dans un tableau en tout cas puisque tu ne connais pas le nombre de client à la base ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 11:21:01    

Ventilo a écrit a écrit :

Un Client est un Thread, donc en gros mon program est une boucle qui attend des conexion pendant que chaque client est géré par un thread...  
 
C'est pas ca qui faut faire??  




c'est quoi l'intérêt de stocker les Clients dans un tableau ... si tu fais un start dessus il s'executeront même si tu ne garde pas leur référence ...
 
ca ca devrait marcher ...  
 
while (true) {
   new Client(serversocet.accept()).start();
}

Reply

Marsh Posté le 06-03-2002 à 11:22:15    

il veut peut etre garder une ref sur ces clients pour faire des stats ou d'autres choses dans ce gout là.
 
Mais le tableau n'est pas la bonne structure pour cette utilisation. essaie plutot avec un Vecteur (meme si c'est pas ce qu'il y a de plus efficient)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 11:23:15    

DarkLord a écrit a écrit :

il veut peut etre garder une ref sur ces clients pour faire des stats ou d'autres choses dans ce gout là.
 
Mais le tableau n'est pas la bonne structure pour cette utilisation. essaie plutot avec un Vecteur (meme si c'est pas ce qu'il y a de plus efficient)  




ArrayList !!!! ;)

Reply

Marsh Posté le 06-03-2002 à 11:24:55    

oui juste puisque ce sont des clients. My mistake :(


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 11:34:49    

Benou : pas toujours : pour les applets, on peut pas utiliser l'ArrayList!! Bouhou!

Reply

Marsh Posté le 06-03-2002 à 11:36:29    

Je fais un serveur P2P (je suis à la mode  :sol:) donc je dois garder une liste des clients pour pouvoir broadcaster des événement: chat/anoncement etc...
 
J'ai un petit problème avec les thread justement, ILS NE SE FERMENT JAMAIS  :fou:
 
J'ai regarder dans les tutorials de SUN mais je suis pas capable de totalement les terminer!! La classe n'est jamais == null, la je comprend vraiment pas pourquoi :( la fonction stop() de mon thread n'est jamais appeller!!  
 
Vous auriez pas une techniques fiable?

Reply

Marsh Posté le 06-03-2002 à 11:42:19    

public void run {
 
   while(!stopped) {
         ///
   }
 
   public void kill() {
     stopped = true;
   }
}


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 12:03:59    

DarkLord a écrit a écrit :

public void run {
 
   while(!stopped) {
         ///
   }
 
   public void kill() {
     stopped = true;
   }
}  




 
Normalement est-ce que la fonction stop() du thread sera appeller avec cette technique?

Reply

Marsh Posté le 06-03-2002 à 12:12:08    

c'est deprecated stop()


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 13:59:47    

gfive a écrit a écrit :

Benou : pas toujours : pour les applets, on peut pas utiliser l'ArrayList!! Bouhou!  




 
Bâh pourquoi ?

Reply

Marsh Posté le 06-03-2002 à 14:12:12    

il veut dire sans le JRE (avec la JVM du browser qui n'est pas 1.3


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-03-2002 à 14:30:34    

Benou : Ouais, C'est exacteent ce que dit Dark! Et...Depuis que je fais des applets (jre 1.1.5), je passe mon temps à potasser la javadoc à la recherche des champs "since"....Par exemple, pour couper le début d'un StringBuffer, en jre 1.1.5.....C une horreur! Faut le retourner, couper la fin, et le reretourner.....C null!! bouhou!

Reply

Marsh Posté le 06-03-2002 à 14:43:16    

Comme l'a dis darklord, le meilleure moyen est de faire une boucle sur un boolean et de mettre se boolean a false lorsque tu veux stopper le thread.
Cette methode n'appelera pas la fonction stop du thread, le thread se finira juste de maniere naturelle.
Si tu veut faire un peu de nettoyage juste avant que le thread ne se termine tu peux le faire aprez la boucle :
 
public void run {  
 
  while(running) {  
        ///  
  }  
  //c'est ici que tu fais ton nettoyage
  nettoyage();
}
 
public void nettoyage()
{
  ...
}
  public void kill() {  
    running = false;  
  }

Reply

Marsh Posté le 06-03-2002 à 15:15:30    

benou a écrit a écrit :

 
c'est quoi l'intérêt de stocker les Clients dans un tableau ... si tu fais un start dessus il s'executeront même si tu ne garde pas leur référence ...
ca ca devrait marcher ...  
while (true) {
   new Client(serversocet.accept()).start();
}  




Ca a tout de meme un inconvenient.
Il n'y a pas de moyen de limiter le nombre de clients, de faire
des timeout depuis le thread principal (quand un thread est plante), de fermer des connexions proprement lors d'un shutdown,
de gerer un pool de connexions etc..
je pense qu'il y a plein de raisons pour lesquelles on voudrait
conserver une trace des clients ouverts.
 
A+
LEGREG

Reply

Marsh Posté le 06-03-2002 à 15:18:08    

je suis bien d'accord, mais bon, ca fait 2 lignes, faut pas trop demander non plus ! ;)
évidement, pour un vrai programme, il faut gérer les connections mieux que ca ...

Reply

Marsh Posté le 06-03-2002 à 15:27:13    

Bah déjà, j'imagine que y'a un identifiant pour chaque client...A ce moment là, une HashTable (ou une HashMAp) pour les gérer est très bien...Pour limiter le nombre de connections, c'est facile : avant d'en acepter une nouvelle, si hash est ta table de hashage qui gère les connections, tu fais :  
 
if (hash.size() < MAX_CON) {
  // Accepter la connection
} else {
  // Refuser la connection  
}

Reply

Marsh Posté le 06-03-2002 à 15:29:55    

on se perd la.
 
LEGREG

Reply

Marsh Posté le 06-03-2002 à 20:09:56    

legreg a écrit a écrit :

on se perd la.
 
LEGREG  




 
Ben voyon  :lol:  
 
Mais j'ai réglé mon problème, je cherchais pas à la bonne place... Ma classe client avait une référence obscure qui faisait qu'elle nétait jamais "terminé".
 
 :hello:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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