2013-02-23 50 views
0

我正在使用客戶端 - 服務器體系結構在Java中創建Intra Office消息傳送系統。我想要實現的功能是:實時聊天和發送消息給特定用戶或用戶組,文件傳輸和語音聊天。Java中的客戶端服務器LAN Messenger

我已經實現了客戶端可以在服務器上登錄的服務器和客戶端模塊。爲此,我使用了DataInputStreamDataOutputStream。當用戶提交用戶名和密碼時,我將它們存儲在由分號分隔的單個字符串中;「」然後我使用DataInputStream將此字符串發送到服務器,我將它們分開並運行數據庫查詢並向客戶端應用程序發送適當的確認。

現在我想實現聊天和消息。我的問題是,我應該使用相同的方法嗎?還是有更好的解決方案?另外,如何將消息發送到特定客戶端(客戶端A只想將消息發送給客戶端B)。在提出解決方案時,請記住我還必須實施語音聊天(gstreamer)作爲文件傳輸!

此外,我維護一個數組,其中包含登錄到服務器的所有客戶端的名稱,該服務器用於向每個客戶端顯示登錄客戶端的列表。

回答

3

首先,通過以純文本字符串的形式發送用戶名和密碼,您幾乎可以自由地將其發送出去 - 任何擁有一些基本工具的人都可以嗅探用戶名和密碼。您將需要閱讀密碼學以及如何確保連接。 Java有一個內置的密碼庫,這使得這非常容易。

如果可能的話,我會推薦使用已經開發的聊天協議,如XMPP(Jabber),因爲它已經存在很多免費的Java庫實現,比如Smack,它將爲您做所有事情。實際上,這裏不需要重新發明輪子,除非你這樣做是爲了一個不允許任何使用外部圖書館的學校項目,而這些圖書館本身是非常雄心勃勃的。 XMPP支持文本聊天,語音聊天和文件傳輸。

還有一些功能齊全的開源聊天客戶端,您可以根據自己的特定需求進行修改。但要記住的一點是開源項目的許可。一些開放源代碼許可證(如流行的GPL)要求在項目中使用開源項目的任何部分都要求您發佈整個項目的源代碼。這對於一個公司來說可能是非常災難性的,所以要小心。

如果你仍想從頭開始,那麼你需要實現自己的協議通信的。你必須自己設計這個,同時考慮到你將如何整合gstreamer和文件傳輸。

同樣,我會推薦至少看看一些已經設計好的協議,比如XMPP,以獲得一些想法。

通常,協議有,

  • 一些數據說明這是什麼類型的請求/響應的。這可能是一個數字值存儲爲單個字節,或者一些文本字符串,就像在HTTP中所做的那樣
  • 更多與消息的用戶有關的數據。可能是IP地址,用戶名,兩者的組合等。如果您直接進行通信,則不需要不通過中間人服務器
  • 發送請求
  • 時的數據本身
  • 某種形式的加密。最開始的用戶被授權

例如,一個很基本的協議可能是後,

 
Request type: 1 byte. 1 = text, 2 = voice data, 3 = file transfer, 4 = request for currently logged-in client list 

Destination: int (IP address) 

Time: long. Best to send this as UTC time, e.g. what System.currentTimeMillis returns 

Length of data: int 

Data: variable length data, depending on type 

然後,發送每種類型的數據,你會執行不同的數據,

  
Text: string as sent by DataStream 

Voice: voice data from gstreamer (not sure how gstreamer works) 

File transfer: 

    File name: String as sent by DataStream 

    Length: long 

    Data: As read from FileInputStream 

List of currently-logged in clients: 
    Data: as sent by DataStream.writeObject 

祝你好運

+0

+1。 (+2?我會)很多細節和很多事情說。一些注意事項:目的地可能是一個ID,用戶名等,特別是如果有外部通信以及內部。密碼100%應該/必須加密。此外,密碼應始終存儲和傳輸散列。所以'hash - > encrypt - > transmit - > decrypt - > authenticate'。不應該有任何已知的方法來顛倒散列 - 你想要的最後一件事是有人獲取每個人的電子郵件密碼。 – 2013-02-23 19:59:04

+0

謝謝oroboro!這真是一個很好的解釋! +1! – kunal18 2013-02-23 20:06:05