0

コンソールで実行しているチャット ルームがあります。サーバーは、スレッドの使用を通じて複数のクライアントをサポートします。私がそれを実行すると、サーバー、次にクライアント、クライアントは正常に接続します。私がクライアント プログラムを通じてメッセージ「hello」を送信すると、クライアントはメッセージを出力し、サーバーがメッセージを受信したことを示します (これがサーバーの役割です)。しかし、同時に別のクライアントを実行すると、一方のクライアントでメッセージを送信しますが、メッセージは他方のクライアントに出力されません。なぜそうなるのでしょうか?エラーはなく、クライアントは正常に接続されています。

よろしく Bl-H

リクエストに応じてコードを投稿します。

これはサーバーがクライアントにメッセージを送信するためのコードです (これはスレッド クラスのメソッドです)。

public void run() {
            PrintStream output = null;
            BufferedReader input = null;
            String message;
            try {
                //i/o for clients:
                output = new PrintStream(server.getOutputStream());
                input = new BufferedReader(new InputStreamReader(server.getInputStream()));
            } catch (IOException ioe) {
                System.err.println(ioe);
                System.exit(1);
            }

            while(true) {
                try {
                    message = input.readLine();
                    output.println(message);
                } catch (IOException ioe) {
                    System.err.println(ioe);
                    System.exit(1);
                }
            }
        }
4

2 に答える 2

1

サーバー側では、クライアントごとに 1 つのスレッドを作成する場合、(各クライアントの) PrintWriter を取得する必要がある (Runnable インターフェイスを実装する) HandleClient クラスが必要です。各 PrintWriter は、サーバーと 1 つのクライアント間の接続を象徴しています。(クライアントを表す)のArrayListを作成し、PrintWriterそれをループしてそのようなことをするだけです(正確には覚えていません)

public void transferMessagetoAll(PrintWriter sender)
{
    for(i=0;i<PrintWriterArray.size();i++)
    {
        if(PrintWriterArray.get(i) != sender)
        {
             PrintWriterArray.get(i).println("something");
        }
    }
}

また、クライアントの「送信者」PrintWriter をtransferMessagetoAll() メソッドのパラメーターに設定する必要があります。これにより、送信者から送信者以外のすべての人にメッセージを転送できます。

この種の Java ソフトウェア (UI 付き) は既にリリースしています。私が仕事から戻ったら、私の個人的なソース コード (学者のプロジェクトであっても構いません) を送ることができます。

于 2012-06-14T07:29:43.557 に答える
0

ハッシュマップを使用して、すべてのクライアントをそこに配置できますHashMap<String, DataOutputStream> clients = new HashMap<String, DataOutputStream>();

public void run() {
    try {
        dis = new DataInputStream(s.getInputStream());
        dos = new DataOutputStream(s.getOutputStream());
        while (true) {
            dos.writeBytes("enter nick: ");
            name = dis.readLine().trim();
            if (chatters.get(name) != null) {
                dos.writeBytes("nick has already been taken..."+n);
            } else {
                break;
            }
        }
        chatters.put(name, dos);
        sendToAll(name+" entered the chatroom... chat away"+n+n);
        sendToAll(name+" exited the chatroom...");
        chatters.remove(name);
        dos.close();
        dis.close();
        s.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

ちなみにここのnはprivate static final String n = "\r\n";

于 2013-02-06T12:37:11.503 に答える