2011-03-27 116 views
0

我嘗試實現一個Java聊天程序。在這個程序中,多個客戶端將通過服務器相互通話。服務器會將來自客戶端的消息中繼到另一個客戶端它還將提供更新到好友列表。從概念上講,實現此即時通訊聊天的最佳途徑是什麼。我遇到的問題是將服務器中繼消息從一個客戶端發送到另一個客戶端。每個客戶端也應該能夠選擇他們想要交談的人。再一次,服務器的唯一目的是從一個客戶端獲取消息並將其發送到另一個客戶端。如果一個客戶端連接到服務器,則直到另一個客戶端連接纔會發生。然後兩個客戶開始相互溝通。Java多客戶端即時通訊軟件概念幫助

+1

恐怕你需要比這更具體。你到底有什麼問題?處理實際的網絡I/O?用什麼數據結構來存儲客戶端元數據?設計您將使用的協議? – biziclop 2011-03-27 23:11:07

回答

0

你需要想出實現一個協議;退房XMPP。問題的一部分是確定您將要發送消息的其他用戶。 XMPP有助於解決這個問題。我建議每個連接到服務器的用戶都有一個線程來處理連接。然後,您可以將所有線程存儲到HashMap中,其中的密鑰將是用戶名。然後只需將消息推送到將消息發送給客戶端的線程實現。

+0

所以我應該將客戶端服務器連接存儲在一個表或列表中,但一個客戶端將如何與另一個客戶端進行通信? – Delanoy 2011-03-27 23:30:23

+0

他們不直接與對方通話,他們與服務器交談,服務器跟蹤消息需要發送到的位置。因此,用戶A向服務器發送消息「發送給用戶B」,然後服務器看到用戶B已連接併發送消息「用戶A說」。 – jmichalicek 2011-03-27 23:50:14

+0

@Delanoy:客戶端A會向服務器發送XMPP消息;服務器會查看它連接的客戶端HashMap(或ArrayList或LinkedList或某些容器類型(如果您想要將其中一個),以查找客戶端B.如果成功,服務器會將新消息推送到客戶端B的隊列中,並將收據發送回客戶端A.如果不成功,服務器可以向客戶端A發送故障。注意:當我說服務器查找客戶端B它正在尋找客戶端B連接的服務器中的線程。 – Suroot 2011-03-28 02:01:52

0

對於你將要在以下特徵的基本的聊天系統:

  1. 客戶端登錄到服務器。這使您可以識別客戶端併爲每個客戶端保留好友列表。
  2. 客戶端只向客戶端發送消息。
  3. 客戶端只接收來自服務器的消息。
  4. 每封郵件必須標識以下內容:
    1. 郵件的收件人。
    2. 消息的來源。
    3. 該消息的文本。
    4. 也許;消息發送的時間和日期。
  5. 服務器需要跟蹤對話;基本上是客戶端對的列表。
  6. 如果您想進行羣組聊天,那麼轉換將成爲客戶端列表。
  7. 當客戶端向服務器發送消息時,服務器應該將其轉發給作爲對話一部分的所有其他客戶端。
  8. 您可能希望讓服務器記錄所有對話。
  9. 您至少需要2種消息類型;文本(即聊天)和邀請。