2011-11-21 120 views
1

我需要幫助思考客戶端連接並與所有其他客戶端進行通信的設計。我認爲每個客戶端將同時需要一個ServerSocket來偵聽來自其他客戶端的傳入連接,以及一個Socket來啓動與其他客戶端的連接。如何讓客戶端爲其他客戶端創建一個套接字

我測試在本地主機上,因此,如果我使用的端口號來跟蹤連接,我碰到這樣的場景:

Socket A (OS assigned port: a) initiates connection with ServerSocket B (known port: 2222) 
Both clients record that connection (a, 2222) is made 
Socket B (OS assigned port: b) initiates connection with ServerSocket A (known port: 1111) 
Both clients record that connection (b, 1111) is made 

我們應該有每對客戶的1個連接,所以上面是浪費。這就是爲什麼我在考慮自己設置本地端口的原因:場景會改變爲連接(1111,2222)和(2222,1111),並且由於第二個是相同的,所以不會保留。

這聽起來合理嗎?

回答

1

爲什麼你需要客戶端設置它的本地端口?客戶端,服務器套接字的工作方式有點不同。

本質上,當你有客戶彼此交談時,你所得到的是,每個客戶端都有一個傳入端口(服務器套接字),它將監聽其他客戶端。當客戶端希望連接到不同的客戶端時,它將始終使用此端口發起請求。一旦得到請求,客戶端將簡單地接受連接並將其傳遞給處理邏輯(無論是線程還是NBIO類型的邏輯)。在這種情況下,您不必在任何地方定義本地端口。

我認爲你要解決的問題之一是,如果兩個客戶端之間已建立連接,該怎麼辦?在這種情況下,雙方知道誰連接到並且不會建立新的連接。在這種情況下,您正在考慮實現自己的雙向雙工通信協議。

+0

根據你的幫助,我回去再試。你提到的這個問題是我需要幫助的。所以我正在編輯這個問題並在 – Rooster

+0

之上加入它作爲解決方案我最終使用的「協議」是,在每次連接啓動時,您還會發送包含客戶端ID的消息。比我想要的要複雜一點,但它工作到如此地步,我很匆忙。 – Rooster

1

我是新的套接字,所以它可能是基本的,但任何想法做到這一點?

A Map<String, Socket>應該做的工作,其中字符串是遠程客戶端的主機名。

如果您需要舊條目到期等功能,請查看Guava CacheBuilder類。這將創建一個具有各種行爲/功能的自定義映射,以簡化緩存的實現。 (在這種情況下,連接緩存)

+0

那麼現在我只是在本地主機上測試。所以我可以使用類似的想法,但端口是正確的?並且某些客戶端分配給某些端口時,客戶端必須在啓動連接之前設置其套接字的本地端口。這聽起來正確嗎?我可能會有一個後續問題。 – Rooster

相關問題