Java EchoTCPServer-Envoyer à tous les clients
Voici mon code:
SERVEUR:
package com.murplyx.server;
public class Main {
public static void main(String args[]) {
new EchoServer(9000);
}
}
+
package com.murplyx.server;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
private ServerSocket server;
public EchoServer(int port) {
try {
server = new ServerSocket(port);
while (true) {
Socket socket = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(in.readLine() + " | MOD");
socket.close();
}
} catch(Exception err) {
err.printStackTrace();
}
}
}
CLIENT:
package com.murplyx.client;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Main {
public static void main(String args[]) {
try {
while (true) {
Socket socket = new Socket("localhost", 9000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
out.println(input.readLine());
System.out.println(in.readLine());
socket.close();
}
} catch (Exception err) {
System.out.println(err);
}
}
}
Cela fonctionne tout comme il se doit, sauf que je veux que lorsque le serveur envoie le "message" + "/ MOD " au client, je veux que le serveur l'envoie à tous les clients, comment puis-je faire cela?
Je suis nouveau en Java, mais pas en codage, alors aidez-moi si j'ai fait de mauvaises choses qui peuvent être faites plus facilement ou mieux.
Veuillez aider.
Merci beaucoup.
2 answers
Ce que vous pouvez faire est d'enregistrer les sockets clients dans un tableau, puis d'utiliser une boucle for pour envoyer à chaque socket.
Tout d'abord, déclarez votre tableau clientSocket; notez que 5 est juste une taille arbitraire utilisée pour les tests. Déclarez également un compteur int.
public Socket clientSocket[] = new Socket[5];
public int intLastSocket = 0;
// this should be placed where you're waiting to accept connections
while (true) {
printTCP("Ready to accept welcome socket");
clientSocket[intLastSocket] = welcomeSocket.accept();
intLastSocket++;
}
// on the server, call this to send. s is a reference to the server object
public void sendToAllTCP(TCPServer s, String message) {
for (Socket z : s.clientSocket) {
if (z != null) {
PrintStream outToClient = null;
try {
outToClient = new PrintStream(z.getOutputStream());
outToClient.println(message);
} catch (IOException e) {
TCPServer.printTCP("Caught an IO exception trying "
+ "to send to TCP connections");
e.printStackTrace();
}
}
}
}
DANS VOTRE CODE:
Paquet com.murplyx.serveur;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
private ServerSocket server;
// use the clientSocket Array to save each new connection
public Socket clientSocket[] = new Socket[5];
public EchoServer(int port) {
try {
server = new ServerSocket(port);
// this should be placed where you're waiting to accept connections
while (true) {
System.out.println("Ready to accept welcome socket");
clientSocket[intLastSocket] = server.accept();
intLastSocket++;
//send your message here, note that putting
//it here will send it each time u add a new connection
sendToAllTCP(/*the message you want to send */);
}
} catch(Exception err) {
err.printStackTrace();
}
}
public void sendToAllTCP(String message) {
// this is an enchanced for loop, i don't know if it's in other languages
// but in java it's supposed to let you loop through
//each object in any iterable list
// such as array, arraylist, linkedlist, etc
for (Socket z : clientSocket) {
if (z != null) {
//basically this chunk of code declares output and input streams
//for each socket in your array of saved sockets
PrintStream outToClient = null;
try {
outToClient = new PrintStream(z.getOutputStream());
outToClient.println(message);
} catch (IOException e) {
System.out.println("Caught an IO exception trying "
+ "to send to TCP connections");
e.printStackTrace();
}
}
}
}
}
Selon le moment où vous voulez envoyer votre message, vous pouvez utiliser la console et sys.in
envoyer. Par exemple, si vous lisez une ligne de {[2] } et .equals("sendMsg")
, alors vous peut appeler sendToAllTCP(yourmessage)
Vous devriez jeter un oeil au serveur de chat multithread. Chaque client qui se connecte obtient son propre thread.
Voici la réponse parfaite à votre question:
Chat client-serveur multithread, en utilisant des sockets
Bonne chance mon pote!