我正在尝试在JAVA中为我的通信器Client-Server编写简单的在线状态显示器。当有人连接时,它会在我的JList中显示新成员。简单。我有一个名为“容器”的类,顾名思义,它包含对List对象和消息对象的引用。我的列表是一个简单的映射,其中key是每个用户的唯一ID,String是他的昵称。此映射在List Object中作为字段。然后,我将此序列化对象发送到客户端。问题是当我有两个客户端时,首先连接到服务器的人只能看到1个在线(他自己)而第二个看到两个(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); }
}
答案 0 :(得分:1)
当第一个客户端连接时,您发送客户端列表。这包括客户端1.当客户端2连接时,您发送客户端列表。这包括客户端1和客户端2.第一个客户端只看到1个连接,因为只有一个连接。如果您希望第一个客户端看到两个连接,则每次客户端连接或断开与服务器的连接时,您都需要更新所有客户端。