2013-01-05 29 views
1

我試圖在Java中實現一個小的局域網IM系統。我有一個KDC(密鑰分發中心)用於爲用戶分配會話密鑰。下面是關於我最初的設計圖:關於與登錄用戶聊天 enter image description here
步驟
(兩個用戶A和B)
發送請求到KDC說,他希望與交談B
2. KDC向前請求B
3. B接受或拒絕該請求
4.如果B接受,KDC將發送A的公共柯y以BB的公鑰A,否則發送空
5. AB生成密鑰相互
現在我問題聊天:
我用ServerSocket實現KDC。它將管理和發送公鑰。我使用Socket來實現User,我知道如何讓UserKDC通信,但我不知道如何讓User與另一個User通信。所以我必須同時使用SocketServerSocket來實現User?如果A與兩個或更多其他用戶同時對話。如何處理User中的socketsserver socketsJava ServerSocket和Socket實現IM系統

+0

不與你的問題相關,但除非你正在做它來學習的東西或爲了好玩,你爲什麼不使用一個Jabber/XMPP服務器?這個問題已經解決了。 –

+0

@GuidoGarcía這是我的信息安全作業,但不是實際應用:) – Ggicci

+0

UserA將發送一條消息到服務器,服務器而不是將消息路由到UserB。你必須明確提出一個協議。另一種選擇是將用戶A的IP詳細信息轉發給用戶B(反之亦然)並啓動連接。 –

回答

0

顯然,服務器必須郵件推送到用戶(轉發請求)。因此,無論是用戶保持一個永久套接字連接對服務器開放,或者用戶必須準備好接受來自服務器的新連接。

對於第一種選擇,你可以通過路由服務器,即多爲服務器協商的原始請求時,它也分發郵件的用戶之間的所有郵件。優點:基礎設施相對簡單,您可以使用相同的邏輯處理請求和消息,並且將消息分發給多個用戶很容易。明顯的缺點:服務器成爲所有消息的瓶頸,而安全性方面它會看到所有消息。

第二個選擇裝置,是的,每個用戶必須具有一個ServerSocket以接受通過套接字傳入連接,以及發起的傳出連接。在這種情況下,你必須找到一個可靠的方式來談判誰與誰聯繫。一個自然的解決方案是讓發送聊天請求的用戶也通過Socket連接到另一個用戶的ServerSocket。優點:消息可以直接在用戶之間傳遞。缺點:基礎設施要複雜得多,尤其是當多個用戶互相聊天時。它並不比集中服務器解決方案更安全,因爲它仍然需要服務器來處理請求。

0

嗨,我想你應該通過網狀-socketio實現它,在你的情況下,KDC應該知道每一個節點,但每個節點沒有必要知道別人,所以KDC的主要功能是路由信息。 嘗試使用socketio替換io,您將獲得更好的性能! netty-socketio的鏈接如下圖所示! https://github.com/mrniko/netty-socketio