【问题标题】:Client/Server chat, sending online user list, only received by the most recently connect client?客户端/服务器聊天,发送在线用户列表,仅由最近连接的客户端接收?
【发布时间】:2014-03-22 23:37:27
【问题描述】:
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 类中,我将添加到位于主服务器类(上图)中的“Client”的静态 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 秒愉快地收到此列表,直到,另一个客户端连接到服务器,一旦发生这种情况,第一个客户端停止接收列表,新的客户端取代它,获取所有“已接收列表”通知。这是怎么回事?

编辑: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);

在客户端本身

【问题讨论】:

  • 如何在客户端初始化“out”?它是如何声明的?
  • 在初始化'Client' in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream());它成功地以这种方式发送消息,只是简单地发送到最后一个连接
  • 请复制“out”的实际声明,我猜它是静态的,因此在类的实例之间共享。这会给出你描述的症状。
  • ^ BINGO BINGO 我们赢了!谢谢!自己永远不会发现它。将其发布为我可以接受的答案?

标签: java client-server chat


【解决方案1】:

请复制“out”的实际声明,我猜它是静态的,因此在类的实例之间共享。那会给出你描述的症状。

【讨论】:

    【解决方案2】:

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

    还要确保你正在做一些事情

    • 确保客户端实现可序列化
    • 还要确保在每次写入客户端后刷新

    【讨论】:

    • 1:检查,2:添加到帖子中的代码
    【解决方案3】:

    我建议你放

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

    【讨论】:

    • 我原来是这样做的,只是为了测试而四处走动,功能上是一样的。
    【解决方案4】:

    clients.add(Client.this);

    这并不像你认为的那样。 你想做的事:

    clients.add(this);
    

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

    【讨论】:

    • 从下面引用自己的话“这就是我最初的做法,只是为了测试而四处走动,功能上是一样的。”我只是在制作客户端时添加它。更改为“this”也会留下同样的问题
    • 实际上 datahaki 和我建议的内容与您的问题之间存在很大差异。您在问题中提出的内容已损坏。
    • 我的意思是,已经纠正了它(如您的回复)并且在 datahaki 所述的方法中问题仍未解决,无论我将客户端添加到列表。无论如何,感谢您的响应并发现该错误,但事实证明问题是我的输出缓冲区被声明为静态 doh
    【解决方案5】:

    这是 Java Server with Multiclient communication 上的示例代码,与我已经发布的上下文相同。

    它可能会帮助你理解它。

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2016-04-09
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多