2012-01-03 160 views
0

這是我第一次使用P2P,我需要一些關於設計的幫助。編寫一個簡單的P2P聊天應用程序

我正在開發一個簡單的消息應用程序。我有一個目錄服務器,每個用戶在該目錄服務器上進行身份驗證並通告每個用戶都可以訪問的開放端口。目錄服務器維護用戶和端口,我可以查詢任何特定用戶的目錄服務器。這部分完成了。第二部分是我認爲應該是P2P的聊天。我可以開始聊天以及我可以作爲聊天的終點(客戶端以及服務器)

什麼令我困惑的是我該如何處理P2P?我是否創建兩個不同的套接字?我正在偵聽TCP請求傳入連接,並從另一個偵聽TCP請求開始聊天。

在這種情況下,我需要3個套接字,一個與服務器通話,另一個與P2P通話?

+0

你應該可以接收和發送同一個套接字,所以我會說1個連接到服務器,然後每個聊天1個連接。 – 2012-01-03 22:37:48

+0

如果你瀏覽'p2p'標籤,你會發現很多人最近都問過這個確切的問題 - 他們中的大多數人都希望在C#中使用解決方案。出於興趣,這是來自課程/家庭作業嗎?目前對P2P聊天感興趣的人數對於這樣的利基領域非常高,imo。 – halfer 2012-01-03 23:58:49

+0

我同意羅伊 - 兩個插座。實際上你可能只需要一個,因爲目錄套接字只需定期打開更新。這將是非常昂貴的 - 就打開連接到服務器而言 - 讓它永久打開。 – halfer 2012-01-04 00:01:45

回答

0

如果你想去P2P,你最好使用一個框架,如JXTA,如果你使用Java編碼。創建套接字本身可能不夠,因爲如果您在局域網之外運行,則需要處理更復雜的問題,如NAT穿越。

看起來好像你有一箇中央對等體(一些服務器)。如果它具有公共IP地址,那麼您可以實現類似TURN的體系結構(對等體通過該中心對等體進行通信)。如果你想在對等點之間直接連接,你正在尋找一個STUN解決方案,但你仍然需要一箇中央對等點來促進通信。

TCP Stun並不容易。 UDP不是很複雜,你只需要在NAT中打個洞。現在請記住,NAT穿越並不總是可能的(這取決於NAT本身)。在這種情況下,STUN備份解決方案之一。