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