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.

Author: super, 2015-01-12

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)

 1
Author: Aify, 2015-01-13 17:35:19

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!

 0
Author: Johan, 2017-05-23 11:56:59