0

我正在尝试用 JAVA 为我的通信器客户端服务器编写简单的在线状态显示器。当有人连接时,它会在我的 JList 中在线显示新成员。简单的。我有一个名为“容器”的类(顾名思义)包含对列表对象和消息对象的引用。我的列表是一个简单的地图,其中 key 是每个用户的唯一 ID,String 是他的昵称。此地图在列表对象中作为一个字段。然后,我将此序列化对象发送给客户端。问题是当我有两个客户端时,第一个连接到服务器的人只看到 1 个在线(他自己),第二个看到两者(2 个在线)。这很奇怪,例如,当我只发送一个带有多个在线成员的整数时,两个客户端都看到“2” - 所以这是正确的,当我尝试在发送给客户端之前打印在线客户端的数量(map. 大小())我看到“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 个连接,因为只有一个。如果您希望第一个客户端看到两个连接,则每次客户端连接或断开与服务器的连接时,您都需要更新所有客户端。

于 2013-01-22T00:29:37.680 回答