Je travaille sur un programme Java qui est essentiellement un forum de discussion. Ceci est une tâche pour la classe donc pas de code s'il vous plaît, je suis juste avoir quelques problèmes qui déterminent la façon la plus réaliste de gérer ce que je dois faire. J'ai un programme serveur déjà configuré pour un seul client en utilisant des threads pour obtenir le flux d'entrée de données et un thread pour gérer l'envoi sur le flux de sortie de données. Ce que je dois faire maintenant est de créer un nouveau thread pour chaque requête entrante.Utilisation de threads pour gérer des sockets
Mon idée est de créer une liste chaînée pour contenir les sockets client, ou éventuellement le thread. Où je trébuche est de savoir comment gérer l'envoi des messages à tous les clients. Si j'ai un thread pour chaque message entrant, comment puis-je faire demi-tour et l'envoyer à chaque socket client.
Je pense que si j'avais une liste des clientsockets, je pourrais alors traverser la liste et l'envoyer à chacun, mais ensuite je devrais créer un flux de sortie de données à chaque fois. Est-ce que je peux créer une liste liée de dataoutputstreams? Je suis désolé si j'ai l'impression que je suis en train de divaguer, mais je ne veux pas commencer à le coder, ça pourrait être compliqué sans un bon plan. Merci!
EDIT J'ai décidé de publier le code que j'ai jusqu'à présent. Je n'ai pas encore eu l'occasion de le tester, donc tout commentaire serait génial. Merci!
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class prog4_server {
// A Queue of Strings used to hold out bound Messages
// It blocks till on is available
static BlockingQueue<String> outboundMessages = new LinkedBlockingQueue<String>();
// A linked list of data output streams
// to all the clients
static LinkedList<DataOutputStream> outputstreams;
// public variables to track the number of clients
// and the state of the server
static Boolean serverstate = true;
static int clients = 0;
public static void main(String[] args) throws IOException{
//create a server socket and a clientSocket
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(6789);
} catch (IOException e) {
System.out.println("Could not listen on port: 6789");
System.exit(-1);
}// try{...}catch(IOException e){...}
Socket clientSocket;
// start the output thread which waits for elements
// in the message queue
OutputThread out = new OutputThread();
out.start();
while(serverstate){
try {
// wait and accept a new client
// pass the socket to a new Input Thread
clientSocket = serverSocket.accept();
DataOutputStream ServerOut = new DataOutputStream(clientSocket.getOutputStream());
InputThread in = new InputThread(clientSocket, clients);
in.start();
outputstreams.add(ServerOut);
} catch (IOException e) {
System.out.println("Accept failed: 6789");
System.exit(-1);
}// try{...}catch{..}
// increment the number of clients and report
clients = clients++;
System.out.println("Client #" + clients + "Accepted");
}//while(serverstate){...
}//public static void main
public static class OutputThread extends Thread {
//OutputThread Class Constructor
OutputThread() {
}//OutputThread(...){...
public void run() {
//string variable to contain the message
String msg = null;
while(!this.interrupted()) {
try {
msg = outboundMessages.take();
for(int i=0;i<outputstreams.size();i++){
outputstreams.get(i).writeBytes(msg + '\n');
}// for(...){...
} catch (IOException e) {
System.out.println(e);
} catch (InterruptedException e){
System.out.println(e);
}//try{...}catch{...}
}//while(...){
}//public void run(){...
}// public OutputThread(){...
public static class InputThread extends Thread {
Boolean threadstate = true;
BufferedReader ServerIn;
String user;
int threadID;
//SocketThread Class Constructor
InputThread(Socket clientSocket, int ID) {
threadID = ID;
try{
ServerIn = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
user = ServerIn.readLine();
}
catch(IOException e){
System.out.println(e);
}
}// InputThread(...){...
public void run() {
String msg = null;
while (threadstate) {
try {
msg = ServerIn.readLine();
if(msg.equals("EXITEXIT")){
// if the client is exiting close the thread
// close the output stream with the same ID
// and decrement the number of clients
threadstate = false;
outputstreams.get(threadID).close();
outputstreams.remove(threadID);
clients = clients--;
if(clients == 0){
// if the number of clients has dropped to zero
// close the server
serverstate = false;
ServerIn.close();
}// if(clients == 0){...
}else{
// add a message to the message queue
outboundMessages.add(user + ": " + msg);
}//if..else...
} catch (IOException e) {
System.out.println(e);
}// try { ... } catch { ...}
}// while
}// public void run() { ...
}
public static class ServerThread extends Thread {
//public variable declaration
BufferedReader UserIn =
new BufferedReader(new InputStreamReader(System.in));
//OutputThread Class Constructor
ServerThread() {
}//OutputThread(...){...
public void run() {
//string variable to contain the message
String msg = null;
try {
//while loop will continue until
//exit command is received
//then send the exit command to all clients
msg = UserIn.readLine();
while (!msg.equals("EXITEXIT")) {
System.out.println("Enter Message: ");
msg = UserIn.readLine();
}//while(...){
outboundMessages.add(msg);
serverstate = false;
UserIn.close();
} catch (IOException e) {
System.out.println(e);
}//try{...}catch{...}
}//public void run(){...
}// public serverThread(){...
}// public class prog4_server
"thread par requête" ou "thread par socket" ne s'adapte pas - pensez à ce qui se passerait lorsque des clients 5K sont connectés à votre serveur. –
Je ne suis pas sûr de ce que vous voulez dire, dites-vous que je dois limiter le nombre de threads? – Levi
Nikolai, quel est le but de votre 'plainte' si vous ne proposez pas une meilleure idée? Je serais également intéressé de savoir comment «mettre à l'échelle» correctement :) –