如何在列表中存储客户端

时间:2015-04-16 20:18:50

标签: java sockets networking arraylist network-programming

我正在运行服务器,我有一个类型为Client的arraylist 当客户端连接时     的ServerSocket.accept() 我将新的Socket传递给arraylists构造函数。这是构造函数中的所有内容

this.add(new Client(Socket client));

我的问题是当客户端断开连接时,它会关闭Socket,但它不会删除它在arraylist中的位置,并将所有内容都移到一个位置。所以arraylist不断变大。

我可以做些什么/用来解决这个问题?

有时我会运行将在所有客户端上执行的命令,这就是我将客户端存储在arraylist中的原因。

在服务器中存储客户端是否有更好的选择?

更新1

课程处于起步阶段。很少实施。到目前为止,答案中建议的HashMap选项最适合我。谢谢你的回复

4 个答案:

答案 0 :(得分:3)

有趣的问题。

你应该在这里使用哈希映射。添加带有对象作为值的客户端并使用一些键。每当您断开连接时,请将其从地图中删除。

一个好问题可能是关键是什么?可能是对象引用(取决于您的选择)或对客户端对象唯一的任何东西(如果没有,您可以轻松生成它)。

Map<Integer,Client> clientMap = new HashMap<Integer,Client>();

答案 1 :(得分:2)

您应该从ArrayList中删除客户端,列表中的其余元素将自动沿列表向上移动。

//java.util.ArrayList.remove(Object) shifts any subsequent elements
// to the left (subtracts one from their indices).

比如说,如果客户端是客户端A而ArrayList是ArrayListA,那么你应该应用

ArrayListA.remove(ClientA);

但是, 更好的方法 将使用HashMap存储客户信息,如Danyal Sandeelo的回答中所述。

答案 2 :(得分:0)

如果客户是你自己的班级,那么你可以试试这个:

public class Client {

public final List<Client> clients;

public Client(List<Client> clients, Socket socketClient) {
    this.clients = clients;
    clients.add(this);
}

public void disconnect() {
    clients.remove(this);
}}



   List<Client> clients = new ArrayList<Client>();
    new Client(clients, new Socket());
    new Client(clients, new Socket());
    new Client(clients, new Socket());

答案 3 :(得分:0)

我做了很多假设,例如我假设你的disconnect()课程中有Client方法。如果您想要更准确的解决方案,请提供更多详细信息。

这样做的一种方法是将回调传递给您的客户,以便在完成后将其从ArrayList中移除。非常粗略的实施:

public class Callback {
    private ArrayList<Client> clients;

    public Callback(ArrayList<Client> clients) {
        this.clients = clients;
    }

    public void remove(Client client) {
        clients.remove(client);
    }
}

然后在实例化Callback时传递Client

Callback callback = new Callback(list);
list.add(new Client(socket, callback));

然后调用回调的remove()方法。如果Clientdisconnect()方法,那么您可以在其中执行

public void disconnect() {
    // bla bla
    callback.remove(this);
}

这样Client可以在需要时自行清理:)