客户端/服务器聊天,发送在线用户列表,仅由最近连接的客户端接收?

时间:2014-03-22 23:37:28

标签: java client-server chat

static ArrayList<Client> clients = new ArrayList<Client>();    
while (true)
            {                                              
                Socket s = server.accept();
                System.out.println("Client connected from " + s.getLocalAddress().getHostName());  

                Thread t = new Thread(new Client(s));
                t.start();                   

            }

简单地说,在刚刚创建的Client类中,我将添加到&#39; Client&#39;的静态ArrayList中。位于主服务器类(上图),即

clients.add(Client.this);

然后我就是每10秒钟,将当前在线用户作为对象发送到当前ArrayList中的所有客户端(全局消息生效)

 for(int i =0; i < clients.size(); i++)
                   {
                       System.out.print("sending list");
                       clients.get(i).sendList();
                   }

现在,它正确地添加了正确数量的客户端等。并且列表被正确收集,客户端每10秒钟愉快地收到此列表,UNTIL,另一个客户端连接到服务器,一旦发生这种情况,第一个客户停止接收列表,新的一个接收列表,获取所有收到的列表&#39;通知。怎么回事?

编辑:sendList()代码

public void sendList()
        {
            try 
            {
                ChatListObject list = new ChatListObject();
                list.setList(helper.getOnlineUsers());
                out.writeObject(list);
                out.flush();
            } 
            catch (IOException iOException) 
            {
                System.out.println(iOException);
            }
        }

尝试添加客户端的事情:

                Client client = new Client(s);              
                Thread t = new Thread(client);
                t.start();                       
                clients.add(client);

clients.add(this);

在客户端本身

5 个答案:

答案 0 :(得分:2)

请复制&#34; out&#34;的实际声明,我猜它是静态的,因此在类的实例之间共享。这会产生你描述的症状。

答案 1 :(得分:1)

你能告诉我们.sendList()的方法吗?

还要确保你做了一些事情

  • 确保客户端实现Serializableable
  • 还要确保在每次写入客户端后都要刷新

答案 2 :(得分:1)

我建议你把

Client myClient = new Client(s);
clients.add(myClient);
Thread t = new Thread(myClient);

答案 3 :(得分:1)

  

clients.add(Client.this);

这不符合你的想法。 你想做的事:

clients.add(this);

或者更好的是,跳过静态客户端列表并在创建对象时添加客户端。

答案 4 :(得分:0)

以下是我已发布的相同上下文中 Java Server with Multiclient communication 的示例代码。

它可能会帮助您理解它。