Quelque difficulté à passer de C++ à Java [JAVA] - Programmation
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:
|
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+
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!" );
}
Marsh Posté le 05-03-2002 à 09:19:09
prems
[jfdsdjhfuetppo]--Message édité par DarkLord--[/jfdsdjhfuetppo]
Marsh Posté le 05-03-2002 à 10:02:16
DarkLord a écrit a écrit : prems |
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
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!
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 :
|
pour crée un client je fait:
Code :
|
Donc si je veux plus d'un client il faut je le les mette dans un array style
Code :
|
, donc je ne peut pas faire
Code :
|
parce qu'il essaie de me crée 100 clients sur le même socket
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
[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]
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]
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
j'avais mal compris le principe des arrays
Je comprend pourquoi ca voulait pas compiler
[jfdsdjhfuetppo]--Message édité par Ventilo--[/jfdsdjhfuetppo]
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
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
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??
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 ...
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();
}
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)
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 !!!!
Marsh Posté le 06-03-2002 à 11:24:55
oui juste puisque ce sont des clients. My mistake
Marsh Posté le 06-03-2002 à 11:34:49
Benou : pas toujours : pour les applets, on peut pas utiliser l'ArrayList!! Bouhou!
Marsh Posté le 06-03-2002 à 11:36:29
Je fais un serveur P2P (je suis à la mode ) 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
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?
Marsh Posté le 06-03-2002 à 11:42:19
public void run {
while(!stopped) {
///
}
public void kill() {
stopped = true;
}
}
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?
Marsh Posté le 06-03-2002 à 12:12:08
c'est deprecated stop()
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 ?
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
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!
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;
}
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
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 ...
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
}
Marsh Posté le 06-03-2002 à 20:09:56
legreg a écrit a écrit : on se perd la. LEGREG |
Ben voyon
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é".
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:
Mais en java je ne peut pas car:
1) ya pas de pointeurs
2) une fois larray crée, tout les items sont instanciers
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]