2012-03-25 77 views
0

_Hey,我有一個問題。我想寫的應用程序將有多個聊天室,等等。 現在我有一些服務器的麻煩。我的想法是將客戶端的數據存儲在VectorSocket類的Vector中。Java多客戶端服務器應用程序 - 如何組織套接字

ClientSocket的類將是這樣的:

​​

在主服務器線程:

ServerSocket serverSocket; 
Vector<ClientSocket> sockets; 

這個想法是:在建立新的連接,使一個新的線程,通過插座矢量一個參數,生成播放器id,遍歷向量元素,檢查client_id是否存在,如果不存在,設置id,如果是,則生成next,並執行相同操作。

問題在哪裏?我擔心同步。如果兩個客戶同時到達,會發生什麼情況,同時矢量大小會發生變化?我是否正確? Maby有一個更好的主意來組織它?

在此先感謝 馬爾辛

//編輯

我的意思是這種情況,但我想我會用彼得Lawrey解決方案:

Situation

+0

'Vector'是同步的,你總是可以同步自己。你真正的問題是什麼? – EJP 2012-03-25 09:43:23

回答

1

由於您需要通過client_id查找客戶端,我會使用Map。如果您使用ConcurrentMap,它將是線程安全的。

ConcurrentMap<Integer, Socket> socketByClientIdMap = new ConcurrentHashMap<>(); 

// check if a client exists already, 
if (socketByClientIdMap.containsKey(clientId)) 

// add a socket by client id. 
socketByClientIdMap.put(clientId, socket); 

// get a socket for a client_id 
Socket s = socketByClientIdMap.get(clientId); 
0

會發生什麼事,如果兩個客戶同時到達,並且矢量大小 將在此期間改變?

由於上一個新的連接創建一個新的線程(如您在您的文章說)

在建立新的連接,使一個新的線程,通過插座 向量作爲參數

然後你有2個線程爲2個客戶端在同一時間到達。
因此,2個線程在您使用的Vector上運行。

Vector作爲一類是本身​​所以沒有做傷害。

但也Vector被認爲是一個相當過時集合,以便也許你會想使用較新的集合數據結構,如List這是不同步的,但並必須要麼使用從Collection還下了syncronized wrapper或同步自己。