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);
在客户端本身
答案 0 :(得分:2)
请复制&#34; out&#34;的实际声明,我猜它是静态的,因此在类的实例之间共享。这会产生你描述的症状。
答案 1 :(得分:1)
你能告诉我们.sendList()的方法吗?
还要确保你做了一些事情
答案 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 的示例代码。
它可能会帮助您理解它。