Программа Multi Chat Alert, транслирующая только 1 клиенту

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

Client 1    

package popup;

    import java.io.*;
    import java.net.*;
    import javax.swing.*;

    public class ClientJFrame extends javax.swing.JFrame {

        static Socket s;
        static DataInputStream din;
        static DataOutputStream dout;

        public ClientJFrame() {
            super("Client 1");
            initComponents();
        }



        private void alertButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
            // TODO add your handling code here:
            try {
                String msgout = "Alert client 1\n";
                dout.writeUTF(msgout);
            } catch (Exception e) {
            }
        }                                           


        public static void main(String args[]) {


            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new ClientJFrame().setVisible(true);


                }
            });
            try {
                s = new Socket("127.0.0.1", 111);
                din = new DataInputStream(s.getInputStream());
                dout = new DataOutputStream(s.getOutputStream());
                String msgin = "";
                while (true) {

                    msgin = din.readUTF();
                    messageArea.append(msgin);
                    JOptionPane.showMessageDialog(null, "BITCH WE ON FIRE");
                    s.close();
                    System.exit(0);

                }
            } catch (Exception e) {
            }
        }

        // Variables declaration - do not modify                     
        private javax.swing.JButton alertButton;
        private javax.swing.JScrollPane jScrollPane1;
        private static javax.swing.JTextArea messageArea;
        // End of variables declaration                   
    }

Сервер

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class TestJFrame extends javax.swing.JFrame {

    static ServerSocket listener;
    static Socket s;
    private static final int PORT = 111;

    public TestJFrame() {
        super("Main");
        initComponents();
    }

public static class Handler extends Thread {

        private final Socket socket;
        private DataInputStream in;
        private DataOutputStream out;

        public Handler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {

            try {
                in = new DataInputStream(socket.getInputStream());
                messageArea.append("in\n");
                out = new DataOutputStream(socket.getOutputStream());
                messageArea.append("Out\n");
            } catch (IOException e) {
            }
            while (true) {
                try {
                    String input = in.readUTF();
                    messageArea.append(input);
                    out.writeUTF("We on Fire!!!\n");

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

            }

        }
    }

public static void main(String args[]) throws IOException, InterruptedException {


        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestJFrame().setVisible(false);
                createAndShowGUI();
            }

        });

        listener = new ServerSocket(PORT);
        try {
            while (true) {
                new Handler(listener.accept()).start();
            }
        } finally {
            listener.close();
        }

    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton alertButton;
    private javax.swing.JScrollPane jScrollPane1;
    private static javax.swing.JTextArea messageArea;
    // End of variables declaration                   
}

Подводя итог, можно сказать, что у вас есть многопоточный tcp-сервер, который обрабатывает несколько клиентов одновременно разными потоками ... Если приходит сообщение, сервер печатает его на JMessageArea ?! (Кстати, вы должны выполнить этот код в EDT), но отправив только строку «We on Fire !!! \ n» обратно источнику / клиенту ... Если вы хотите, чтобы сервер транслировал сообщение, вы должны удерживать список подключений, что-то вроде List <Socket> clients;, а затем итерация по нему for(Socket socket : clients) { socket.getOutputStream().write(...) }; ...

0x1C1B 03.08.2018 20:05

Не желая рекламировать свой собственный код, в последние недели я разработал базовый многопользовательский чат для сокетов ... Он определенно не идеален, но работает, и если вы посмотрите на Room.java и, возможно, User.java, вы увидите один из возможных способов как транслировать сообщения ...

0x1C1B 03.08.2018 20:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
36
1

Ответы 1

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

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

Взгляните на образец наблюдателя, я думаю, это поможет вашему проекту.

Другие вопросы по теме