我正在运行服务器,我有一个类型为Client的arraylist 当客户端连接时 的ServerSocket.accept() 我将新的Socket传递给arraylists构造函数。这是构造函数中的所有内容
this.add(new Client(Socket client));
我的问题是当客户端断开连接时,它会关闭Socket,但它不会删除它在arraylist中的位置,并将所有内容都移到一个位置。所以arraylist不断变大。
我可以做些什么/用来解决这个问题?
有时我会运行将在所有客户端上执行的命令,这就是我将客户端存储在arraylist中的原因。
在服务器中存储客户端是否有更好的选择?
更新1
课程处于起步阶段。很少实施。到目前为止,答案中建议的HashMap选项最适合我。谢谢你的回复
答案 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()
方法。如果Client
有disconnect()
方法,那么您可以在其中执行
public void disconnect() {
// bla bla
callback.remove(this);
}
这样Client
可以在需要时自行清理:)