Javaがサーバーに接続されているすべてのクライアントにメッセージを送信させる方法

オスカーK.:

クライアントがサーバーにメッセージを送信し、サーバーが接続されているすべてのクライアントにそのメッセージを送信して表示するチャットプログラムを作成しようとしています。プログラムは機能しますが、クライアントがメッセージを送信すると、メッセージを受信するだけで、接続されている残りのクライアントは何も取得しません。

顧客コード:


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);

            //set frame visible
            frame.pack();
            frame.setVisible(true);

            System.out.println("<Client>: opened stream");

            while(sending) {
                while((getMSG = in.readLine()) != null) {
                    System.out.println(getMSG);
                    textArea.append(getMSG + "\n");
                }
            }
        } 
    }       
}   

サーバーコード:

public class Server {

    public static void main(String[] args) {
        boolean listening = true;
        try (ServerSocket serverSocket = new ServerSocket(1010)) {
            while(listening) {
                new ServerThread(serverSocket.accept()).start();
                System.out.println("opened thread");
            }

        } catch(IOException e) {
            e.printStackTrace();
        }

    }
}

サーバースレッドコード:

public class ServerThread extends Thread {

    private Socket socket = null;

    public ServerThread(Socket socket) {
        super("ServerThread");
        this.socket  = socket;
    }

    public void run() {
        try (
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ) {
            System.out.println("stream opened");
            String getMSGs;

            while((getMSGs = in.readLine()) != null) {
                out.println(getMSGs);
                System.out.println("msg received and sent");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

前もって感謝します。

ベルビックス:

非常に簡単な決定で、リストのような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();
        }
    }
}

大きなプロジェクトの場合は、メッセージング用のキューを作成することをお勧めします

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Thrift: サーバーに接続されているすべてのクライアントにメッセージを送信します

分類Dev

1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

分類Dev

サーバーが接続されているクライアントにメッセージを送信しない

分類Dev

Boost ASIO:接続されているすべてのクライアントにメッセージを送信します

分類Dev

Qtのサーバーから接続されたクライアントにメッセージを送信する方法

分類Dev

Grpc-あるクライアントから同じサーバーに接続されている別のクライアントにメッセージを送信します

分類Dev

MQTTサーバーは、接続が許可されていないことを示すメッセージをクライアントに送信するにはどうすればよいですか?

分類Dev

Elixirのtcpサーバーから開いている接続内のtcpクライアントにメッセージを送信する

分類Dev

WebSocketサーバーに接続されているすべてのクライアントの「実際の」IPアドレスを取得する方法

分類Dev

サーバーからすべてのクライアントにメッセージを送信する

分類Dev

すべてのクライアントにメッセージを送信するPythonTCPサーバー

分類Dev

サーバーからすべてのクライアントにメッセージを送信する

分類Dev

ローカルネットワーク内のNFSサーバーに接続されているクライアントのリストを取得する方法

分類Dev

GoでブロックせずにクライアントがTCP接続経由で送信する1つのメッセージのすべてのデータを読み取るにはどうすればよいですか?

分類Dev

GRPCサーバーに接続されているクライアントを検査する方法

分類Dev

HTTPメソッドがサポートされていない場合にクライアントにメッセージを送信する

分類Dev

リバースシェル-サーバーにクライアントに送信された複数のメッセージを印刷させる方法

分類Dev

リモートサーバーポートに接続されているすべてのクライアントを取得します

分類Dev

デバイスがAndroidでWiFiに接続されているときにセルラーネットワークのIPアドレスを取得する方法

分類Dev

接続されているすべてのクライアントに一定間隔でデータを送信します。フラスコソケット

分類Dev

PerlでWebsocketの接続されたクライアントに定期的なメッセージを送信するにはどうすればよいですか?

分類Dev

すべてのクライアント(Python、ソケット)にメッセージを送信するサーバーが必要です

分類Dev

ソケットを介して接続されている特定のクライアントにメッセージを送信するにはどうすればよいですか

分類Dev

クライアントが接続される前に送信されたキューからメッセージを受信するActiveMQ

分類Dev

クライアントからの接続時にCamelWebsocketコンポーネントにメッセージを送信させる方法は?

分類Dev

すべてのクライアントにメッセージを送信する

分類Dev

サーバーソケットにそれが存在することをブロードキャストさせ、クライアントソケットにそれを検出させて接続させる方法

分類Dev

Socket.sendall()が接続されているすべてのクライアントに送信されない

分類Dev

Java RMIを使用してサーバーからクライアントにメッセージを送信するにはどうすればよいですか?

Related 関連記事

  1. 1

    Thrift: サーバーに接続されているすべてのクライアントにメッセージを送信します

  2. 2

    1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

  3. 3

    サーバーが接続されているクライアントにメッセージを送信しない

  4. 4

    Boost ASIO:接続されているすべてのクライアントにメッセージを送信します

  5. 5

    Qtのサーバーから接続されたクライアントにメッセージを送信する方法

  6. 6

    Grpc-あるクライアントから同じサーバーに接続されている別のクライアントにメッセージを送信します

  7. 7

    MQTTサーバーは、接続が許可されていないことを示すメッセージをクライアントに送信するにはどうすればよいですか?

  8. 8

    Elixirのtcpサーバーから開いている接続内のtcpクライアントにメッセージを送信する

  9. 9

    WebSocketサーバーに接続されているすべてのクライアントの「実際の」IPアドレスを取得する方法

  10. 10

    サーバーからすべてのクライアントにメッセージを送信する

  11. 11

    すべてのクライアントにメッセージを送信するPythonTCPサーバー

  12. 12

    サーバーからすべてのクライアントにメッセージを送信する

  13. 13

    ローカルネットワーク内のNFSサーバーに接続されているクライアントのリストを取得する方法

  14. 14

    GoでブロックせずにクライアントがTCP接続経由で送信する1つのメッセージのすべてのデータを読み取るにはどうすればよいですか?

  15. 15

    GRPCサーバーに接続されているクライアントを検査する方法

  16. 16

    HTTPメソッドがサポートされていない場合にクライアントにメッセージを送信する

  17. 17

    リバースシェル-サーバーにクライアントに送信された複数のメッセージを印刷させる方法

  18. 18

    リモートサーバーポートに接続されているすべてのクライアントを取得します

  19. 19

    デバイスがAndroidでWiFiに接続されているときにセルラーネットワークのIPアドレスを取得する方法

  20. 20

    接続されているすべてのクライアントに一定間隔でデータを送信します。フラスコソケット

  21. 21

    PerlでWebsocketの接続されたクライアントに定期的なメッセージを送信するにはどうすればよいですか?

  22. 22

    すべてのクライアント(Python、ソケット)にメッセージを送信するサーバーが必要です

  23. 23

    ソケットを介して接続されている特定のクライアントにメッセージを送信するにはどうすればよいですか

  24. 24

    クライアントが接続される前に送信されたキューからメッセージを受信するActiveMQ

  25. 25

    クライアントからの接続時にCamelWebsocketコンポーネントにメッセージを送信させる方法は?

  26. 26

    すべてのクライアントにメッセージを送信する

  27. 27

    サーバーソケットにそれが存在することをブロードキャストさせ、クライアントソケットにそれを検出させて接続させる方法

  28. 28

    Socket.sendall()が接続されているすべてのクライアントに送信されない

  29. 29

    Java RMIを使用してサーバーからクライアントにメッセージを送信するにはどうすればよいですか?

ホットタグ

アーカイブ