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

 


Dernière réponse
Sujet : [JAVA] Quelque difficulté à passer de C++ à Java
Ventilo

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Ventilo

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:

LeGreg on se perd la.
 
LEGREG
gfive 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  
}
benou 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 ...
LeGreg

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

hastur 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;  
  }
gfive 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!
darklord il veut dire sans le JRE (avec la JVM du browser qui n'est pas 1.3
Cherrytree

gfive a écrit a écrit :

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




 
Bâh pourquoi ?

darklord c'est deprecated stop()
Ventilo

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?

darklord public void run {
 
   while(!stopped) {
         ///
   }
 
   public void kill() {
     stopped = true;
   }
}
Ventilo 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?
gfive Benou : pas toujours : pour les applets, on peut pas utiliser l'ArrayList!! Bouhou!
darklord oui juste puisque ce sont des clients. My mistake :(
benou

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 !!!! ;)

darklord 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)
benou

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();
}

darklord bin tu dois pas mettre ca dans un tableau en tout cas puisque tu ne connais pas le nombre de client à la base ...
Ventilo 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??
darklord

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

benou 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
Ventilo

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]

matafan 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]

Ventilo 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]

benou

DarkLord a écrit a écrit :

 
fuck off!  :fou:  




 
:lol: :hello:

darklord

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:

Cherrytree :D
gfive hahaha!!! Et toceuuuuh!!! :D:D:D
 
Merci Benou!
benou

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 ;)

darklord prems :D

 

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

gfive Une semaine de vacances, j'ai perdu la main! bouhou!! :D
gfive 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
darklord

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+

Ventilo 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]


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