[BUG] : Client

cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004 - 16 mars 2004 à 19:15
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004 - 16 mars 2004 à 23:21
Salut,
j'ai encore un problème avec ce code-source. en faite tout va bien quand j'ai 1 client en telnet mais dès que j'en ai plusieurs, seul le premier peut écrire et envoyer des données au serveur, les autres quand j'écris j'ai rien.
Ca fait 3jours que je cherche le bug sans comprendre c'est du à quoi et quelle est la correction à faire ?
Merci d'avance.

import java.io.*;
import java.net.*;
import java.util.*;

public class Serveur
{
public static void main(String[] args)
{
System.out.println("Serveur de chat lancé...");
try
{
ServerSocket Paquet = new ServerSocket(4444);
Socket Liste_connections[] = new Socket[10];
Liste_connections[Nombre_connections] = Paquet.accept();
Nombre_connections++;
if (Nombre_connections == 1)
{
FileWriter Logs = new FileWriter("Logs.txt", true);
Logs.write("[ Début de conversation ]");
}
Thread Tache = new TravailServeur(Liste_connections, Nombre_connections);
Tache.start();
}
catch (Exception Erreur_connection)
{Erreur_connection.printStackTrace();}
}
private static byte Nombre_connections;
}

class TravailServeur extends Thread
{
public TravailServeur(Socket Tableau_connections[], byte Nombre_connections)
{
IP = Tableau_connections[Nombre_connections - 1];
IPS = Tableau_connections;
}

public void run()
{
try
{
Fin_connection = false;
Flux_entree = new BufferedReader(new InputStreamReader(IP.getInputStream()));
Logs = new FileWriter("Logs.txt", true);
Logs.write("[ Une personne viens de se joindre à la conversation ]");
while (Fin_connection == false)
{
Texte = Flux_entree.readLine();
if (Texte != null)
{
if (Texte.equals("KILL CONNECTION"))
{Fin_connection = true;}
for (byte Nombre = 0; Nombre < IPS.length; Nombre++)
{
if (IPS[Nombre] != null)
{
Flux_sortie = new PrintWriter(IPS[Nombre].getOutputStream(), true);
Flux_sortie.println("Utilisateur : " + Texte);
}
}
Logs.write("Utilisateur : " + Texte);
System.out.println("Utilisateur : " + Texte);
}
}
IP.close();
System.out.println("Fin de connection");
Logs.write("[ Fin de conversation ]\n\n");
Logs.close();
}
catch (Exception Erreur)
{Erreur.printStackTrace();}
}

private FileWriter Logs;
private Socket IP;
private Socket IPS[];
private String Texte;
private PrintWriter Flux_sortie;
private BufferedReader Flux_entree;
private boolean Fin_connection;
}

2 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
16 mars 2004 à 22:58
Salut,
c'était l'objet de ma remarque lors de ton précédent message : ton serveur n'est pas multithreadé. Il accepte le premier client et c'est tout. Normalement il devrait y avoir une boucle infinie dans le bloc try catch qui attend en permanence les clients. Et seul le premier peut envoyer des messages car les autres clients se connectent à la socket qui est toujours présente mais n'accepete pas les nouveaux clients.
Voici une correction (désolé j'ai un peu changé ton code et renommer les variables : en java les variables commencent par une minuscule.)

public class Serveur extends Thread {

    private List clients;

    public static void main(String[] args) {
        new Serveur().start();
    }

    /**
     * @see java.lang.Runnable#run()
     */
    public void run() {
        clients = new Vector();
        System.out.println("Serveur de chat lancé...");

        try {
            ServerSocket serverSocket = new ServerSocket(44444);
            while (true) {
                System.out.println("En attente nouveau client");
                Socket client = serverSocket.accept();
                System.out.println("Arrivée nouveau client");
                TravailServeur travailServeur = new TravailServeur(client);
                clients.add(travailServeur);
                Iterator iterator = clients.iterator();
                System.out.println("Envoie liste des clients connecté");
                while (iterator.hasNext()) {
                    TravailServeur travailServeur2 = (TravailServeur) iterator.next();
                    travailServeur2.setClients(clients);
                }
                FileWriter Logs = new FileWriter("Logs.txt", true);
                Logs.write("[ Début de conversation ]");
                travailServeur.start();
            }
        } catch (Exception Erreur_connection) {
            Erreur_connection.printStackTrace();
        }
    }

}

public class TravailServeur extends Thread {

    private Socket client;
    private List clients;

    public TravailServeur(Socket client) {
        this.client = client;
    }

    public void run() {
        boolean finConnection = false;
        FileWriter logs = null;
        BufferedReader fluxEntree = null;
        PrintWriter fluxSortie = null;
        try {
            fluxEntree = new BufferedReader(new InputStreamReader(client.getInputStream()));
            logs = new FileWriter("Logs.txt", true);
            logs.write("[ Une personne viens de se joindre à la conversation ]");
            while (!finConnection) {
                String texte = fluxEntree.readLine();
                if (texte != null) {
                    if (texte.equals("KILL CONNECTION")) {
                        finConnection = true;
                    }
                    if (!finConnection) {
                        Iterator iterator = getClients().iterator();
                        while (iterator.hasNext()) {
                            try {
                                TravailServeur travailServeur = (TravailServeur) iterator.next();
                                fluxSortie = new PrintWriter(travailServeur.client.getOutputStream(), true);
                                fluxSortie.println("Utilisateur : " + texte);
                            } catch (SocketException e1) {
                            }
                        }
                        logs.write("Utilisateur : " + texte);
                        System.out.println("Utilisateur : " + texte);
                    }
                }
            }
            System.out.println("Fin de connection");
            logs.write("[ Fin de conversation ]\n\n");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                logs.close();
                fluxEntree.close();
                client.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    /**
     * @param clients
     */
    public synchronized void setClients(List clients) {
        this.clients = clients;
    }

    /**
     * @return Returns the clients.
     */
    public synchronized List getClients() {
        return clients;
    }
}

0
cs_Bouki Messages postés 43 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 11 décembre 2004
16 mars 2004 à 23:21
Merci bcp, j'avais pas compris dans ma precedente question mais maintenant je crois que j'ai compris le principe et le code-source, merci bcp bcp pour cette grande aide :D
0
Rejoignez-nous