コミュニケーターのクライアント サーバー用に 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); }
}