2015-04-16 22 views
5

我運行一個服務器的客戶端,和我有一個類型的客戶 的ArrayList當客戶端連接通過 的ServerSocket.accept() 我通過新的Socket到的ArrayList構造函數。這是構造如何存儲在一個列表

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

我的問題是,當一個客戶端斷開連接,關閉插座內的一切,但它並沒有在ArrayList中刪除其現貨和移位都記錄下來之一。因此,數組列表不斷增大。

我能做什麼/用來解決這個問題?

有時我會運行所有客戶端上執行的命令,這就是爲什麼我將客戶端存儲在數組列表中的原因。

有更好的選擇來存儲客戶端在服務器中嗎?

更新1

的類都處於起步階段。很少實施。到目前爲止,答案中建議的HashMap選項最適合我。謝謝你的回覆

+1

你應該檢查客戶端仍連接到服務器。如果不是,則使用'java.util.ArrayList.remove(Object)'方法從ArrayList中刪除客戶端。 –

+0

當客戶端斷開連接時,是否有要刪除的客戶端對象? –

回答

3

有趣的問題。

你應該在這裏使用哈希映射。添加客戶端與對象作爲價值,並使用一些密鑰。每當您斷開連接時,請將其從地圖中移除。

一個很好的問題,我應該是什麼關鍵?可能是對象引用(取決於您的選擇)或任何與客戶端對象相關的唯一對象(如果沒有,您可以輕鬆生成它)。

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

那麼這是一款遊戲,也許我可以使用玩家ID? – Loligans

+1

@Loligans是的,你可以。或者你在那裏的'Client'實例。 – Bubletan

+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的回答所述。

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()); 
0

大量假設由,例如我假設你有你的Clientdisconnect()方法。如果您想要更精確的解決方案,請提供更多詳細信息。

這樣做的一種方式可能是將回調傳遞給客戶端,以便在完成後從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清理後本身時,它需要:)

+0

這些類正處於實施的開始階段。我願意接受任何有意義的事情。專業服務器如何持有客戶? – Loligans