多方聊天警报程序仅向1个客户端广播

时间:2018-08-03 17:53:28

标签: javascript java sockets

我已经启动了此多聊天线程警报系统,并且已经在服务器上成功获得了多个客户端,但是当向所有人广播消息时,它仅与发送消息的初始客户端和仅与服务器发送交互,另一个客户端未收到该消息。 这是我正在使用的代码

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                   
}

1 个答案:

答案 0 :(得分:0)

当客户端连接到服务器时,将其添加到列表中,这样您就始终知道连接的是谁。他断开连接时也是如此。

当客户端发送消息时,根据需要进行处理,然后遍历已连接客户端的列表并向其发送消息。

看看observer pattern,我认为它将对您的项目有所帮助。