0

コミュニケーターのクライアント サーバー用に Java で簡単なオンライン ステータス ディスプレイを作成しようとしています。誰かが接続すると、JList に新しいメンバーがオンラインで表示されます。単純。(名前が示すように) リスト オブジェクトとメッセージ オブジェクトへの参照を含む「コンテナー」というクラスがあります。私のリストは単純なマップです。key は各ユーザーの一意の ID であり、String はユーザーのニックネームです。このマップはフィールドとしてリスト オブジェクトにあります。次に、このシリアル化されたオブジェクトをクライアントに送信します。問題は、私が 2 つのクライアントを持っている場合、最初にサーバーに接続した人が 1 つのオンライン (自分自身) のみを表示し、2 番目のクライアントが両方 (2 つのオンライン) を表示することです。たとえば、多数のオンラインメンバーを含む整数のみを送信すると、両方のクライアントに「2」が表示されるため、奇妙です。これは正しいことであり、クライアントに送信する前にオンラインクライアントの数を出力しようとすると(map. size()) 「2」と表示されます。したがって、送信前は良好ですが、読み取り後は「1」のみです(最初のクライアントの場合)。そんなことがあるものか?

サーバ側:

private void rewrite() {
    online.clear();
    for(int key : handlerMap.keySet()) {
        online.put(handlerMap.get(key).getId(), handlerMap.get(key).getNickname());              
    }     
}

public void run() {
    try {
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        container = new MsgContainer();
        list = new OnlineList();

        while(!interrupt) {
            rewrite();
            list.setOnlineList(online);
            container.setMessage(message);
            container.setList(list); 
            System.out.println("klucz - "+id+" ----------" 

+container.getList().getOnlineList().size()); //id is an unique id. It shows 2 online `for` 
//1st client and 2 for 2cnd. All ok. But when I send and read on first client's side it `//shows only 1,`
            oos.writeObject(container);
            message = null;
            Thread.sleep(100);
        }
        oos.close();
    } 
    catch(InterruptedException e) { System.out.println(e); }
    catch(IOException e) { System.out.println(e); } 

    threadOnlineList.interrupt();
}

クライアント側:

public void run() {
    try {
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        while(!interrupt) {
            if(ois.readObject() != null) {
                MsgContainer container = (MsgContainer) ois.readObject();
                //updateList(container.getList().getOnlineList());
                System.out.println(container.getList().getOnlineList().size()); 
////shows 
//1 for first client and 2 for second one.
            }
            Thread.sleep(100);
        }
        ois.close();
    } 
    catch(IOException e) { System.out.println(e); }
    catch(InterruptedException e) { System.out.println(e); }
    catch(ClassNotFoundException e) { System.out.println(e); }
}
4

1 に答える 1

1

最初のクライアントが接続したときに、クライアントのリストを送信します。これにはクライアント 1 が含まれます。クライアント 2 が接続したら、クライアントのリストを送信します。これには、クライアント 1 とクライアント 2 が含まれます。最初のクライアントは、接続が 1 つしかないため、1 つの接続しか認識しません。最初のクライアントに両方の接続を認識させたい場合は、クライアントがサーバーに接続または切断するたびに、すべてのクライアントを更新する必要があります。

于 2013-01-22T00:29:37.680 に答える