begin process at 2008 08 22 02:08:14
1 229 745 membres
17 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Serveur multiple qui redistribue les données à TOUT ses clients... [ Archives / Divers ] (Hellway)

Serveur multiple qui redistribue les données à TOUT ses clients... le 14/04/2003 02:36:56

Hellway
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;
/**
* <p>Titre : Serveur du Chat de Fusa</p>
* <p>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.</p>
* <p>Copyright : Copyright (c) 2003</p>
* <p>Société : </p>
* @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

Re : Serveur multiple qui redistribue les données à TOUT ses clients... le 30/04/2003 14:35:52

benohite
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




-------------------------------
Réponse au message :
-------------------------------

> 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;
> /**
> * <p>Titre : Serveur du Chat de Fusa</p>
> * <p>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.</p>
> * <p>Copyright : Copyright (c) 2003</p>
> * <p>Société : </p>
> * @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

Re : Serveur multiple qui redistribue les données à TOUT ses clients... le 29/01/2004 15:06:37

geko321


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 '-_-'


Classé sous : public, string, serveur, client, serveurparticulier

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS