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:
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:
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:
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 :
Citation:
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