0

多くのクライアント間の通信を可能にするJavaチャットアプリケーションを作成しましたが、1つのクライアントが特定のクライアントにメッセージを送信できるようにしたいのですが、他のクライアントはメッセージの送信を見ることができません.あるクライアントが別のクライアントにささやきます。前もって感謝します。

ここに私のクライアントの一部

    public void sendListener(){
        writer.println(clientName2+" : "+broadcastTF.getText() );
        writer.flush();
        broadcastTF.setText("");
        broadcastTF.requestFocus();
    }

    public class listenServer implements Runnable{

        public void run(){
            try{
         String text;
            while((text = reader.nextLine()) != null){
                messageTA.append(text+ "\n");
            }
            }catch(Exception ex){}
        }
    }


private void setupServer(){
    try{
    socket = new Socket("127.0.0.1", 7894);
    writer = new PrintWriter(socket.getOutputStream());
    reader = new Scanner(socket.getInputStream());
    listenServer ls = new listenServer();
    Thread t = new Thread(ls);
    t.start();
    }
    catch(Exception ex){

    }
}

ここに私のサーバーの一部

public class listenToClient implements Runnable{
Scanner reader;
public listenToClient(Socket socket){
    try{
        reader = new Scanner(socket.getInputStream());
    }catch (Exception ex){}
}

public void run(){
    try{
        String text;
        while((text = reader.nextLine()) != null){
                            sendToAll(text);

        }
    }catch(Exception ex){}
}

public void sendToAll(String text){
    for (PrintWriter w : writers){
        try{
            w.println(text);
            w.flush();
        }catch(Exception ex){}
    }
}

}

4

2 に答える 2

0

これは特定のコードとはあまり関係がなく、全体的な設計に関係していると思います。

主に、個々のクライアントを識別する何らかの方法が必要です。高速なルックアップが必要な場合は、ある種のキー/値マップを使用writersして、一意の ID (ユーザー名、ユーザー ID、ランダムな文字列、または状況に適したもの) をキーとして を格納します。それが問題にならない場合は、クライアント接続を単純な数値配列 (または配列のような構造) に格納し、ターゲットが見つかるまで反復してから、その接続のみに送信できます。

次に、送信クライアントは、そのターゲットが何であるかを識別できる必要があり、メッセージとともにターゲット情報を送信する方法も必要です。サーバーで入力を読み取ってエコーするだけでは十分ではありません。ある程度の解析を行う必要があり、おそらくその情報を整理するための何らかのフォーマットを設計する必要があります。

例として、私が設計したあるクライアント/サーバー通信フォーマットでは、メッセージの最初のバイトがキーと値のペアのキーの長さになっていました。サーバーは最初のバイトを読み取り、次のNバイトをキーとして読み取ります。残りのバイトは、値であることがわかっていました。あなたの場合、キーの長さが0の場合、特定の1つの宛先ではなく、全員に送信されることを意味します。

于 2013-05-04T03:32:19.123 に答える