2012-07-27 62 views
0

我正在嘗試實現一個聊天應用程序,並且有一個關於使用TCP或UDP進行對等之間消息交換的設計選擇。我想使用TCP,但遇到以下問題。使用TCP處理多個線程

問題場景: Peer A正在監聽一個衆所周知的端口(如5555)。當對等體B想要發送消息給對等體A時,它連接到A上的端口5555.對等體A接受連接並啓動一個新的線程來處理與對等體B的通信,以便其他對等體(比如對等體C)能夠連接到對等A的5555端口。現在問題在於它不是一個請求/響應協議,所以我很困惑,如果對方A出於任何原因沒有回覆對方B,那麼由B發送的後續消息將被傳送到對等方A上的端口5555?對等體A將爲接收到的每條消息創建單獨的線程。

使用UDP可能會解決這個問題,我不會創建單獨的線程與每個對等進行通信,每個人都可以將消息發送到同一個衆所周知的端口。但我想使用TCP來保證消息將被傳遞。任何想法什麼是處理這個問題的好方法,並且只使用一個線程與同伴進行通信?

回答

2

你描述的問題不會發生,因爲TCP是一個「連接」協議,這基本上意味着兩個對等方必須在發生任何事情之前進行協商。之後,TCP控制數據包的順序以確保它們以正確的順序到達目的地。順便說一下,TCP代表傳輸控制協議,因此它強調確保你描述的內容不會發生。 UDP的情況並非如此。

一旦您的ServerSocket已接受來自客戶端Socket的連接,協商已完成並且TCP流專用於該通信。

創建新的唯一方法是如果您的客戶端通過新的套接字發出另一個連接。

但說服自己的最好方法是將日誌記錄添加到您的應用程序並自行嘗試。

+0

+1。此外,serverSocket應該只監聽預定義端口上的傳入連接;所有進一步的通信之間的通信將隨機(但預先安排)端口完成。 – Shark 2012-07-27 16:32:36

+0

@Shark否。在服務器端,接受的套接字使用與監聽套接字相同的本地端口。不需要預先安排。有關ServerSocket應該做什麼的部分甚至沒有意義,因爲它當然不能做其他事情。 – EJP 2012-07-30 00:57:40

2

你很困惑收聽或服務器,插座和連接插座。

一旦TCP連接在接收端被接受,您就可以在雙方之間建立一個全新的全雙工套接字,以便它們可以交換數據。偵聽套接字的唯一目的是接受連接,沒有應用程序數據流過這些連接。

您可以將新連接的套接字交給線程,但您當然不需要 - 您可以在單個線程中處理許多非阻塞套接字,我相信Java NIO套件就是爲此而創建的。