Serveur multiple qui redistribue les données à TOUT ses clients...

Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004 - 14 avril 2003 à 02:36
geko321 Messages postés 12 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 25 juillet 2005 - 29 janv. 2004 à 15:06
Voilà, mon problème est assez compliqué et je n'ai trouvé en aucun endroit de la toile réponse à ma question. Je tente donc le coup ici.

Je bosse actuellement sur un Chat et je suis confronté à un problème de redistribution des données. J'ai créé un serveur qui accepte de multiples connections (normal pour un chat) et les clients sont gérés avec un thread.

Seulement, je ne sais pas du tout comment redistribuer les données. Ma class ServeurParticulier, a trois méthodes (Fermeture(), Envoyer() Recevoir()), trois constructeurs (Entrant-InputStream, Sortant-OutputStream et CLient-Socket) contient une sous-classe Recevoir qui hérite de Thread pour lire les messages en boucle.

Connaissez-vous un moyen d'appeller la méthode Envoyer() pour tous les ServeurParticuliers crées par le thread initial ?

Mon script (Il ne répond qu'au client qui lui parle :-( ) :

package chatfusa;
/**
* Titre : Serveur du Chat de Fusa

* Description : Ce serveur a pour rôle de créer un serveur particulier
* pour chaque utilisateurs qui accèdent au chat. Ensuite, il a pour but de
* redistribuer les données.

* Copyright : Copyright (c) 2003

* Société :

* @author non attribué
* @version 1.0
*/
import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class Serveur {
public boolean Activation = true;
public static String Partage;
private static int NbUtilisateur;
static final int Port = 8080;
public Serveur() throws IOException
{
NbUtilisateur=0;
ServerSocket ServeurRacine = new ServerSocket(Port);
Information("Serveur " + ServeurRacine + " initialisé.");
try
{
while(Activation=true)
{
// On attend ici jusqu'à avoir
// une demande de Connexion:
Socket Serveur = ServeurRacine.accept();
Information("Client " + Serveur + " initialisé.");
try
{
new ServeurParticulier(Serveur);
}
catch(IOException e)
{
Erreur("Echec de la connexion avec le client " + Serveur + ".");
}
}
}
finally
{
ServeurRacine.close();
}
}
public String CalculerHeure()
{
GregorianCalendar Calendrier = new GregorianCalendar();
int NbHeure = Calendrier.get(Calendar.HOUR);
int NbMinute = Calendrier.get(Calendar.MINUTE);
int NbSeconde = Calendrier.get(Calendar.SECOND);
return NbHeure + ":" + NbMinute + ":" + NbSeconde;
}
public static void Erreur(String Type)
{
new FenetreErreur(Type);
}
public static void Information(String Type)
{
Fenetre.CentreOngletConsoleAffichage.setText(Fenetre.CentreOngletConsoleAffichage.getText() + "\n" + Type);
}
public void Distribuer(String Contenu)
{
Fenetre.CentreOngletAffichage.setText(Fenetre.CentreOngletAffichage.getText() + "\n" + Contenu);
Partage = Contenu;
}
class ServeurParticulier extends Thread
{
private PrintWriter Sortant;
private String Message;
private String Contenu;
private boolean ActivationParticulier = true;
private String NomUtilisateur;
private Socket ServeurParticulier;
private BufferedReader Entrant;
private String Precedent;
// Cette méthode ferme le serveur pour le client en question lorsqu'elle est appelée
public void Fermeture()
{
NbUtilisateur--;
try
{
ServeurParticulier.close();
Information("La connexion avec le client " + ServeurParticulier + " enregistré avec le pseudo : " + NomUtilisateur + " est maintenant fermée.");
}
catch(IOException e)
{
Erreur("La connexion avec le client " + ServeurParticulier + " enregistré avec le pseudo : " + NomUtilisateur + " ne s'est pas fermé correctement");
}
}
public void Envoyer(String Contenu)
{
Sortant.println(Contenu);
}
public String Receptionner()
{
try
{
Contenu = Entrant.readLine();
}
catch(IOException e)
{
Erreur("Reception impossible avec le client " + ServeurParticulier + " enregistré avec le pseudo : " + NomUtilisateur);
ActivationParticulier=false;
}
return Contenu;
}
public ServeurParticulier(Socket ServeurInterm) throws IOException
{
ServeurParticulier = ServeurInterm;
Entrant =
new BufferedReader(
new InputStreamReader(
ServeurParticulier.getInputStream()));
// Autoriser l'auto-vidage:
Sortant =
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
ServeurParticulier.getOutputStream())), true);
new Reception();
//**** new Envoi();
}
// Cette classe permet la réception des messages du client, retourne une chaîne.
class Reception extends Thread
{
public Reception()
{
NomUtilisateur = Receptionner();
start();
}
public void run()
{
try
{
while(ActivationParticulier=true)
{
Envoyer(NomUtilisateur + " [" + CalculerHeure() + "] :" + Receptionner());
}
}
finally
{
Fermeture();
}
}
}
//********

}
}

**************************************************
Hellway, Fusa : L'organisation contre l'impérialisme américain.
http://fusa2.free.fr

2 réponses

benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
30 avril 2003 à 14:35
je me souviens avoir fais qch dans le genre avec un multicastsocket (cf doc api)
je vais chercher voir si je retrouve pas le source auquel cas je te l enverrais

benohite
:big)
0
geko321 Messages postés 12 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 25 juillet 2005
29 janv. 2004 à 15:06
Tu peux ossi utilisé CORBA qui enverrais ton message de l'appli client vers le serveur et du serveur vers un otre client.

Par contre ca fait longtemps que j'ai fais ca alors, je peux po trop tédé, mais je sais que CORBA marche

Gk@O0o_____CORBA___PUBLICIS '-_-'
0
Rejoignez-nous