JAVA Отправить объект всем клиентам

Я пытаюсь поболтать. Когда клиент отправляет сообщение на сервер, он работает, сервер получает сообщение. Итак, я хотел бы разослать это сообщение всем клиентам. Я пробовал много вещей, но они не работают ... Только клиент, который отправляет сообщение, получает это сообщение

Не могли бы вы мне помочь, пожалуйста ? заранее спасибо

PS: извините за мой плохой английский

Это результат в консоли: http://i.stack.imgur.com/VS2wf.png

MainClient

public class MainClient {

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     * @throws java.lang.ClassNotFoundException
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        boolean stop = false;
        Socket socket;
        Scanner nickScan;
        String nick;
        socket = new Socket(InetAddress.getLocalHost(), 2009);

        System.out.println("Hi, what is your name ?");
        nickScan = new Scanner(System.in);
        nick = nickScan.nextLine();

        User u = new User(nick, false, false, true);

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(u);

        EmissionThread e = new EmissionThread(u, socket);
        e.start();

        while(!stop){
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message m = (Message)ois.readObject();
            System.out.println(m.getNick() + " : " + m.getMsg());
        }
        //socket.close();//On ferme les connexions

    }
}

MainServer

public class MainServer extends Thread {

    public static void main(String[] args) throws InterruptedException, IOException {
        // TODO code application logic here
        ConnectionThread c = new ConnectionThread();
        c.start();

    }
}

ConnectionThread

public class ConnectionThread extends Thread {

    private static final boolean stop = false;
    Socket socketduserveur;
    ServerSocket socketserver;
    Session s = new Session("#upec");

    public ConnectionThread() throws IOException {
        this.socketserver = new ServerSocket(2009);
    }

    public ServerSocket getSocketserver() {
        return socketserver;
    }


    @Override
    public void run() {

        while (!stop) {
            try {
                socketduserveur = socketserver.accept(); //On accepte les connexions

                ObjectInputStream ois = new ObjectInputStream(socketduserveur.getInputStream());
                User u = (User)ois.readObject();

                System.out.println(u.getNick() + " c'est connecté");

                s.addUserList(u);

                if (s.listAlone()) {
                    System.out.println("Vous etes admin");
                    u.setAdmin(true);
                }

                 ReceptionThread r = new ReceptionThread(socketduserveur);
                 r.start();

            } catch (ClassNotFoundException ex) {
                Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(ConnectionThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

ReceptionThread

public class ReceptionThread extends Thread {

    private static final boolean stop = false;
    Socket socketduserveur;
    ServerSocket socketserver;

    public ReceptionThread(Socket socketduserveur) {
        this.socketduserveur = socketduserveur;
    }


    @Override
    public void run() {
        while (!stop) {
            try {
                ObjectInputStream ois = new ObjectInputStream(socketduserveur.getInputStream());
                Message m = (Message)ois.readObject();
                System.out.println(m.getNick() + " : " + m.getMsg());


                ObjectOutputStream oos = new ObjectOutputStream(socketduserveur.getOutputStream());
                oos.writeObject(m);

            } catch (IOException | ClassNotFoundException ex) {
                Logger.getLogger(ReceptionThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

EmissionThread

public class EmissionThread extends Thread {

    private User u;
    private Socket socketduserveur;
    private static final boolean stop = false;

    public EmissionThread(User u, Socket socketduserveur) {
        this.u = u;
        this.socketduserveur = socketduserveur;
    }

    @Override
    public void run() {
        while (!stop) {
            try {
                Scanner msgScan;
                String msg;

                msgScan = new Scanner(System.in);
                msg = msgScan.nextLine();
                Message m = new Message(u.getNick(), msg);

                ObjectOutputStream oos = new ObjectOutputStream(socketduserveur.getOutputStream());
                oos.writeObject(m);

            } catch (IOException ex) {
                Logger.getLogger(EmissionThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Сообщение

public class Message implements Serializable {
    private String nick;
    private String msg;

    public Message(String nick, String msg) {
        this.nick = nick;
        this.msg = msg;
    }

}

Сессия

public class Session implements Serializable {
    private String name;
    private ArrayList<String> listSession = new ArrayList();
    private ArrayList<User> listUser = new ArrayList();

    public Session(String name) {
        this.name = name;
    }

    public void addSession(String name){
        listSession.add(name);
    }

    public void deleteSession(String name){
        for(String s : listSession){
            if(name.equals(s)){
                listSession.remove(s);
            }
        }
    }

    public boolean existSession(String name){
        for(String s : listSession){
            if(name.equals(s)){
                return true;
            }
        }
        return false;
    }


    public void addUserList(User u){
        listUser.add(u);
    }

    public boolean listAlone(){
        int compteur = 0;
        for(User u : listUser){
            compteur++;
        }
        return compteur == 1;
    }

}

Пользователь

public class User implements Serializable {
    private String nick;
    private final Session session;
    private boolean admin, moderator, voice;


    public User(String nick, boolean admin, boolean moderator, boolean voice) {
        this.nick = nick;
        this.admin = admin;
        this.moderator = moderator;
        this.voice = voice;
        this.session = new Session("#upec");
    }

}

person Itatalia    schedule 09.03.2015    source источник
comment
Я думаю, вы можете удалить классы геттера / сеттера по умолчанию. Может улучшить читаемость! :)   -  person Bono    schedule 09.03.2015
comment
Со скольким количеством клиентов вы тестируете? как их запустить? не могли бы вы подробно рассказать о том, какой процесс вы начали и какие результаты вы получили?   -  person T.Gounelle    schedule 09.03.2015
comment
У меня есть тест с двумя клиентами. Я отредактировал свой пост и добавил скриншот. Я хочу, чтобы клиенты видели все сообщения. Спасибо :)   -  person Itatalia    schedule 09.03.2015


Ответы (1)


Для этого вы можете использовать веб-сокеты на Tomcat. Если вы загружаете tomcat, в качестве примера уже создано приложение для чата.

person abcdef    schedule 09.03.2015
comment
Спасибо, но это для школы, и я должен использовать этот сокет: / - person Itatalia; 09.03.2015