2015-04-16 19 views
5

yılında Müşteriler saklamak için ve bir istemci ben Dizi Listeleri kurucusuna yeni Soket geçmesi ServerSocket.accept() yoluyla bağlayan zaman tipi Client bir ArrayList var. Bu yapıcınasıl bir sunucu çalıştırıyorum bir liste

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

bir istemci keser, Soket kapattığında Benim sorundur argumanıdır ama arraylist onun yerinde silin ve biri aşağı her şeyi dışına çıkmaz. Arraylist sürekli büyüyor.

Bu sorunu çözmek için/kullanabilecekleri ne yapabilir?

Bazen bir arraylist müşterilerine depolamak neden tüm müşterilerle ilgili yürütülecek komutları çalıştırır.

bir sunucu müşterilerine depolamak için daha iyi bir alternatif var mı?

Güncelleme 1

sınıfları başlangıç ​​aşamalarında bulunmaktadır. Çok az uygulandı. Şimdiye kadar cevapta önerilen HashMap seçeneği benim için en iyisi. Yanıtlarınız için teşekkürler

+1

kontrol etmelisiniz :) gerektiğinde Client kendisini sonra temizleyebilir Bu yolla da sunucusu. Değilse, istemciyi ArrayList'ten kaldırmak için 'java.util.ArrayList.remove (Object)' Yöntemini kullanın. –

+0

İstemcinin bağlantısı kesildiğinde, kaldırmak istediğiniz 'Client' nesnesine sahip misiniz? –

cevap

3

İlginç bir sorun.

Sen .. Burada karma haritayı kullanabilirsiniz değer olarak nesne ile müşteri ekle ve bazı anahtar kullanmalıdır. Bağlantıyı kestiğinizde, haritadan kaldırın.

İyi soru

bana neyi anahtarı olmalıdır ki? nesne referansı (sizin tercihinize bağlıdır) veya müşteri nesnesine göre benzersiz olan herhangi bir şey olabilir (bir şey olması gerekir, eğer olmasa da, kolayca üretebilirsiniz).

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

Peki bu bir oyun, belki oyuncu kimliğini kullanabilir miyim? – Loligans

+1

@Loligans Evet, yapabilirsin. Ya da orada bulunan 'Müşteri' örneğini. – Bubletan

+1

her şeye rağmen, hash haritası anahtarı tutar, böylece kolayca küçültebilir ve artırabilirsiniz. Bu, veri yapısının seçimi ile ilgilidir;) –

2

Sen ArrayList'den Client kaldırmalısınız listede kalan unsurları otomatik listesi boyunca yukarı doğru olarak karıştırılır. Müşteri Müşteri A ve ArrayList ArrayListA ise

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

Say, o zaman,

ArrayListA.remove(ClientA); 

uygulamak Ama gerekir müşteri bilgilerini depolamak için HashMap kullanmak olacaktır iyi bir yaklaşım Danyal Sandeelo'nun cevabında belirtildiği gibi. Müşteri Kendi sınıf ise

0

, o zaman bu bir deneyebilirsiniz:

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

varsayımların bir çok örneğin ben size Client sınıfında disconnect() yöntemine sahip farz ediyorum, yapılır. Daha doğru bir çözüm istiyorsanız daha fazla bilgi verin. Bunu yapmanın

bir yolu bitince o ArrayList kendisini kaldırır böylece müşteriye bir geri arama geçirerek olabilir.Çok kaba uygulanması: Eğer Client örneğini zaman

public class Callback { 
    private ArrayList<Client> clients; 

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

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

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

Sonra geri arama remove() yöntemini çağırın. Client bir disconnect() yöntemi varsa, o zaman içinde size

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

istemci hala bağlıysa

+0

Sınıflar uygulanmaya başlamanın başlangıç ​​aşamasındadır. Mantıklı olan her şeye açığım. Profesyonel sunucular istemcileri nasıl tutar? – Loligans

İlgili konular