亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java如何讓服務器向每個連接的客戶端發送消息

Java如何讓服務器向每個連接的客戶端發送消息

開滿天機 2023-06-21 15:49:21
我正在嘗試創建一個聊天程序,其中客戶端向服務器發送消息,然后服務器將該消息發送到所有連接的客戶端以顯示它。該程序可以工作,但是當客戶端發送消息時,只有它會收到返回的消息,而其余連接的客戶端則不會收到任何信息??蛻舳舜a: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 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號