IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Serveur Multithread (Problème d'envoi à tous les clients connectés)


Sujet :

Langage Java

  1. #1
    Membre du Club Avatar de eon-of-the-scorn
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 83
    Points : 68
    Points
    68
    Par défaut Serveur Multithread (Problème d'envoi à tous les clients connectés)
    Bonjour ,
    Je suis en train de faire un serveur multiconnexion , lorsque le serveur reçoit "total" il envoie au client un message contenant le nombre de connectés , par contre lorsqu'il reçoit "sendall" , il doit faire un broadcast et envoyer un message (socket) à tous les clients connecté , donc il doit parcourir un ArrayList où j'ai stocké tous les thread clients connectés.
    Pour le message "total" tout fonctionne bien , mais pour le broadcasting j'ai toujours des exception .



    Code Serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    import java.io.*;
    import java.net.*;
    import java.util.ArrayList;
     
    public class EchoServer 
    {
        private static final int PORT = 50231;
        public ArrayList<Object> listClients=new ArrayList<Object>();
        public int nbClients;
     
        public static void main(String[] args) 
        {
            try 
            {
            	EchoServer echoserver=new EchoServer();
                ServerSocket vServSocket = new ServerSocket(PORT);
     
                System.out.println("[Server] Up and running!");
     
                while(true) 
                {
                    Socket clientSocket = vServSocket.accept();
     
                    InetAddress clientAddress = clientSocket.getInetAddress();
                    System.out.println("[Server] " + clientAddress.getHostAddress() + " connected.");
     
                    EchoThread thread = new EchoThread (clientSocket,echoserver);
                    thread.start();
                }
     
            } catch (UnknownHostException e) 
            {
                e.printStackTrace();
            } catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
     
        synchronized public int addClient(EchoThread echoThread)
        {
        	nbClients++;
        	listClients.add(echoThread);
    		return listClients.size();    	
        }
     
     
    }

    Code Thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    import java.io.*;
    import java.net.*;
     
    public class EchoThread extends Thread 
    {
        private Socket socket;
        private EchoServer echoserver;
        BufferedReader in;
        BufferedWriter out;
        int numClient;
     
        public EchoThread(Socket socket, EchoServer echoserver) 
        {
            this.socket = socket;
            this.echoserver=echoserver;
            try
            {
            	in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                //numClient=echoserver.addClient(out);
            }
            catch (IOException e) 
            {
            	e.printStackTrace();
    		}  
        }
        public void run() 
        {
        	synchronized (echoserver.listClients) 
        	{
        		numClient=echoserver.addClient(this);
    		}
        	String numberOfConnected;
    		numberOfConnected=Integer.toString(echoserver.listClients.size());
            try 
            {
                String message = in.readLine();
     
                while(message != null) 
                {
                	if (message.equals("sendall"))
                    {
                		//System.out.println("[Server] Client number: " + numClient);
                        System.out.println("[Server] Received message: SendAll");
     
                    	for (int i = 0; i < echoserver.listClients.size(); i++)
                    	{
                    		synchronized (echoserver) 
                    		{
                    			EchoThread client = (EchoThread) echoserver.listClients.get(i);
                    			client.out.write(message + "(The response)" + "\n");
                    			client.out.flush();
                    			System.out.println("[Server] Sending response: " + "Broadcast message to: client no "+ i);
    						}		
                    	}
                    }
                	else if (message.equals("total"))
                	{  		
                		System.out.println("[Server] Client number: " + numClient);
                        System.out.println("[Server] Received message: " + message);
                        System.out.println("[Server] Sending response: " + numberOfConnected);
     
                        out.write(numberOfConnected + "\n");
                        out.flush();
                	}   
                }
                in.close();
                out.close();
                socket.close();
            }
            catch (IOException e) 
            {
                System.out.println("Error sending message");
                e.printStackTrace();
            }
        }
    }
    Code du Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    import java.io.*;
    import java.net.*;
     
    public class EchoClient 
    {
        private static final int PORT = 50231;
        private static final String SERVER_ADDRESS = "localhost";
     
        public static void main(String[] args) 
        {
            try 
            {
                Socket socket = new Socket(InetAddress.getByName(SERVER_ADDRESS), PORT);
     
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
     
                //String outMessage = "Hello";
                System.out.println("[Client] Type your request: ");
                BufferedReader stdin=null;
                stdin=new BufferedReader(new InputStreamReader(System.in));
                String outMessage = stdin.readLine();
                System.out.println("[Client] Sending request: " + outMessage);
                out.write(outMessage + "\n");
                out.flush();
     
                String inMessage = in.readLine();
                System.out.println("[Client] Got response: " + inMessage);
     
                in.close();
                out.close();
                socket.close();
     
            } 
            catch (UnknownHostException e) 
            {
                e.printStackTrace();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
     
    }
    Lorsque je tape "sendall" pour faire un broadcast , voici le message d'erreur que j'obtient :
    Error sending message
    java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
    at java.io.BufferedWriter.flush(BufferedWriter.java:236)
    at EchoThread.run(EchoThread.java:54)
    Pouvez vous m'aider SVP ?
    Merci d'avance
    Aymen
    <Death> to our belonging and our ministy of two set the higher standard and to a greater </fall> descend
    Hébergement gratuit
    Bien choisir un CMS
    Optimisation/Accélération des sites/blogs

  2. #2
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Points : 380
    Points
    380
    Par défaut
    Bonsoir,

    Dans ton EchoThread je lis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String message = in.readLine();
    while(message != null) {
    //...
    }
    tu ne lis ta ligne qu'une seule et unique fois et il boucle sans arrêt sur la même chose. Remplace par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String message;
    while((message = in.readLine()) != null) {
    //...
    }
    Je ne garanti rien mais ça peux aider.

  3. #3
    Membre du Club Avatar de eon-of-the-scorn
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 83
    Points : 68
    Points
    68
    Par défaut
    Merci Grimly pour la réponse , j'ai fait les modifications que tu m'a proposé .
    Lorsque je tape "sendall" à partir d'un client pour envoyer un broadcast à tous les connectés . J'ai toujours la même exception :

    java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at EchoThread.run(EchoThread.java:51)
    l'exception est dans la classe EchoThread ligne 51 , c'est à dire la ligne suivante (en rouge):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while((message = in.readLine()) != null) 
                {
                	
                	if (message.equals("sendall"))
                    {
    mais comme je lis dans l'exception
    java.net.SocketException: Socket closed
    , j'ai enlevé le bloc de code suivant ou je ferme la socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    finally 
            {
            	try
            	{
     
                    in.close();
                    out.close();
                    socket.close();
            	}
            	catch (IOException e) 
            	{
            		e.printStackTrace();
    			}
            	finally
            	{
            		echoserver.delClient(numClient);
            	}
            }
    Mais j'ai toujours le même problème .
    <Death> to our belonging and our ministy of two set the higher standard and to a greater </fall> descend
    Hébergement gratuit
    Bien choisir un CMS
    Optimisation/Accélération des sites/blogs

Discussions similaires

  1. Réponse d'un serveur à tous les clients
    Par Super_carotte dans le forum Langage
    Réponses: 39
    Dernier message: 05/01/2011, 16h01
  2. Client Serveur multithread : problème
    Par cb-bk dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 04/04/2009, 16h05
  3. Réponses: 10
    Dernier message: 18/09/2007, 10h52
  4. Réponses: 11
    Dernier message: 05/09/2007, 09h06
  5. Réponses: 4
    Dernier message: 31/03/2005, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo