UI中的JList不反映来自所有对等进程的更改

时间:2015-04-15 12:29:52

标签: java swing client-server jlist

我正在用Java编写一个简单的聊天应用程序。一旦新用户加入,我的应用程序的服务器组件应该通知所有其他客户端此事件。

服务器端的相关代码如下:

private void notifyUser() throws IOException {
    String[] user = new String[onlineUsers.size()];
    int i = 0;
    for(Socket sock : sockets){
        out.get(i).writeInt(1);
        out.get(i).writeObject(onlineUsers.toArray(user));
        out.get(i).flush();
    }
}

客户端线程正在使用以下代码侦听套接字:

ObjectInputStream in = new ObjectInputStream(sockfd.getInputStream());
while(true) {
    command = in.readInt();
    switch(command) {
        case 1:
            String[] user = (String[])in.readObject();
            System.out.println(user);
            client.addOnlineUsers(user);
    }
}

addOnlineUsers(..)方法包含以下代码:

public void addOnlineUsers(String[] user) {
    for(String s : user){
        listmodel.addElement(s);
    }
}

我像这样实例化了JList:

JList list = new JList(listmodel);

,其中listmodel是公共实例。

但问题是,只要新用户加入服务器,第一个(即最早的)客户端的JList就会更新,而其他用户则不会收到任何用户在其用户界面中更新JList

1 个答案:

答案 0 :(得分:1)

在notifyUser方法中,您只是写入数组中第一个用户的输出流,即

i = 0; 

应该在

之后递增
out.get(i).flush();