为了账号安全,请及时绑定邮箱和手机立即绑定

Java如何让服务器向每个连接的客户端发送消息

Java如何让服务器向每个连接的客户端发送消息

开满天机 2023-06-21 15:49:21
我正在尝试创建一个聊天程序,其中客户端向服务器发送消息,然后服务器将该消息发送到所有连接的客户端以显示它。该程序可以工作,但是当客户端发送消息时,只有它会收到返回的消息,而其余连接的客户端则不会收到任何信息。客户端代码:public class Client {    protected static JTextArea textArea = new JTextArea(20, 30);    protected static String sendMSG, getMSG;    public static void main(String[] args) throws IOException {        String hostName = args[0];        String Username = args[1];        boolean sending = true;        try (            Socket socket = new Socket(hostName, 1010);            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));        ) {            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));            //frame setup            JFrame frame = new JFrame("chat client");            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            //text area            JScrollPane scrollPane = new JScrollPane(textArea);            //text field            JTextField MSGText = new JTextField(5);            //"send" button            JButton sMSGB = new JButton("send");            sMSGB.setPreferredSize(new Dimension(60, 30));            sMSGB.addActionListener(new ActionListener() {                public void actionPerformed(ActionEvent event) {                    sendMSG = MSGText.getText();                    MSGText.setText("");                    out.println("<" + Username + ">: " + sendMSG);                }            });            //panel            JPanel p = new JPanel();            p.setLayout((new BoxLayout(p, BoxLayout.PAGE_AXIS)));            p.add(Box.createVerticalStrut(5));            p.add(scrollPane);            p.add(Box.createVerticalStrut(5));            p.add(MSGText);            p.add(Box.createVerticalStrut(5));            p.add(sMSGB);            p.add(Box.createVerticalStrut(5));            frame.getContentPane().add(p);                }            }        }     }       }   
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

非常简单的决定创建一个像列表一样的 PrintWriter 持有者。不要忘记为此系列创建关闭机制!并考虑多线程。


public class ServerThread extends Thread {

    private final Socket socket;

    private final List<PrintWriter> outs;


    public ServerThread(Socket socket, List<PrintWriter> outs) {

        super("ServerThread");

        this.socket  = socket;

        this.outs = outs;

        System.out.println("Opened outs: " + outs.size());

    }


    private void sendToAll(String msg) throws IOException {

        for(PrintWriter out: outs) {

            out.println(msg);

        }

    }


    public void run() {

        try (

                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        ) {

            System.out.println("stream opened");

            outs.add(out);

            String getMSGs;

            while((getMSGs = in.readLine()) != null) {

                System.out.println("msg received and sent " + getMSGs);

                sendToAll(getMSGs);

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

如果它是一个大项目,最好为消息创建队列


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信