微信外掛之即時通訊系統設計
一、前言
微信是目前最流行的即時通訊工具之一,同時在微門戶、企業管理等方面進行社交平臺應用的擴充套件,尤其是企業號的釋出,更確立了微信作為企業資訊化管理的一種延伸和支援。
二、功能特點
本文將圍繞需求之一,即內部群組聊天展開,具體功能包括:
1、 多群組聊天,使用者基於微信通訊錄;
2、 支援表情功能;
3、 可以傳送文字、圖片、檔案、視訊等資訊;(其中圖片、檔案、視訊作為二期實現);
4、 聊天曆史記錄查詢;
三、功能設計
1、整體框架1) 模組定義
2) 元件定義
整個外掛系統主要包含以下幾個元件(類似於vs的專案工程):
2、資料通訊流程
聊天的資訊互動都採用業界即時通訊普遍的方式,Socket通訊模式實現,整體框架分客戶端和伺服器端:
Ø 客戶端採用html5中的WebSocket元件;
Ø 伺服器端採用C#編寫,並以window服務的方式部署和執行;
通訊流程:
1) 客戶端連線
客戶端在第一次連線時,通知伺服器端,進行“握手”操作。傳送的資料包格式定義:
|
返回結果:
<wxchatmessage>
<action>connect</action>
<result>ok</result> //result:ok,error
</wxchatmessage >
2) 客戶端資料傳送
客戶端連線上伺服器端後,將傳送相關資訊,傳送的資料報格式:
<wxchatmessage> <action>send</action> <!--群組id,如果為空,則表示點對點聊天,touserids必須不為空--> <groupid></groupid> <!--傳送者標識--> <fromusesrid></fromusesrid > <touserids></touserids> //接收者標識,如為空,則所有人;不為空,則表示私聊 <type>text</type> //text:文字、image:圖片、file:檔案、voice:音訊; <content>內容</content> //type=text顯示; <media> //type=text,image,file,voice 支援多個 <url></url> //type=text,image,file,voice <title></title> //type=file </media> //type=image |voice <createdatetime>傳送時間</createdatetime> </wxchatmessage >
3) 伺服器端資料接收
伺服器端接收資料來自客戶端的資料後,首先解析傳送過來的資料包,根據資料包定義進行傳送(給客戶端);
a、 解析客戶端傳送過來的資料;
b、 將傳送的資料存入快取;
4) 伺服器端資料傳送(給客戶端)
伺服器端的資料解析後,判斷touserids和groupid,根據groupid來判斷該訊息傳送給哪個群組;
根據touserids,判斷是傳送給指定群組中的哪些人,就是私聊;
<wxchatmessage>
<action>receive</action>
<!--傳送者標識-->
<fromusesrid></fromusesrid >
<touserid></touserid> //單個接收者標識
<type>text</type> //text:文字、image:圖片、file:檔案、voice:音訊;
<content>內容</content> //type=text顯示;
<media> //type=text,image,file,voice 支援多個
<url></url> //type=text,image,file,voice
<title></title> //type=file
</media> //type=image |voice
<createdatetime>傳送時間</createdatetime>
</wxchatmessage >
5) 客戶端接收訊息
客戶端接收來自於伺服器端傳送的訊息。
a、 根據html5的websocket中的onmessage事件獲取伺服器端傳送的資訊;
b、 根據資料包的格式定義解析;
c、 將解析後的內容呈現在對話視窗中;
6) 客戶端斷開
客戶端斷開後,傳送資料包通知伺服器端。資料包格式:
<wxchatmessage>
<action>disconnect</action>
<!--群組id-->
<groupid></groupid>
<!--傳送者標識-->
<fromusesrid></fromusesrid >
<type>text</type>
<content>內容</content>
<createdatetime>傳送時間</createdatetime>
</wxchatmessage >
3、資料儲存
1) 訊息文字儲存
在利用Socket資料通訊過程中,是不儲存資料的,如實現歷史記錄查詢,必須對所有的內容進行儲存。
儲存的方式將採用間隔定時儲存,將快取中的內容儲存到資料庫中。通知儲存的方式將採用windows服務。
儲存流程:
a、 讀取指定條數快取中最舊的佇列資料,轉換成DataTable批量儲存到資料庫中(sqlbulkcopy方法);
b、 在快取中刪除已存入資料庫的佇列資料;
2) 多媒體(media)儲存
所有的多媒體檔案直接上傳到伺服器目錄下,儲存時間保留5天。
多媒體資料定時儲存到資料庫中。
4、對話視窗
1) 第一次進入
使用者第一次進入聊天介面時,會從資料庫獲取該組聊天的最新x條歷史記錄。
根據使用者id,獲取頭像、暱稱;通過使用者id呼叫微信介面獲取。此處一定要將使用者資訊快取起來,使得使用者資訊有效期保留24小時;
建立socket連線,傳送客戶端資料包;
2) 傳送文字訊息
呼叫訊息時,根據傳送型別,組裝資料包。
呼叫html5的websocket中onsend事件,傳送資料包到伺服器端;
3) 傳送表情
所有的表情符號,使用編碼表示,如微笑圖示:[微笑]等
在對話方塊中顯示的時候,進行語義轉換;
也是文字類訊息的一種。
4) 傳送檔案(該功能僅限Android版本微信使用)
將手機端的檔案上傳給其他使用者;
上傳流程:
a、 選擇本機檔案,點選上傳;
b、 上傳到伺服器,並返回url和檔名資訊;
c、 再將這些資訊包裝成通訊資料包傳送給伺服器端;
d、 伺服器端再發送給接收客戶端;
5) 傳送圖片
傳送圖片將直接呼叫微信的js-sdk,圖片來源有2種,一種是手機圖片,還有一種是直接拍攝後獲取。
基本流程與傳送檔案一致,詳見微信js-sdk開發文件。
6) 傳送音訊
傳送音訊將直接呼叫微信的js-sdk,音訊來源是直接錄音;
基本流程與上傳圖片類似,詳見微信js-sdk開發文件;
四、資料定義
1、外部資料
系統涉及到的外部資料,主要包括使用者基本資訊和使用者組資訊;
使用者基本資訊獲取依賴於微信,並通過微信介面呼叫;
使用者組資訊獲取依賴於微信,並通過微信介面呼叫;
2、資料通訊包定義
詳見“資料通訊流程”章節。
3、資料表定義
1) 資料表:ChatInfo
程式碼 |
註釋 |
資料型別 |
長度 |
ID |
主鍵 |
int |
|
Content |
資訊內容 |
Nvarchar |
500 |
CreateDatetime |
時間 |
datetime |
|
FromUserId |
傳送者賬號(微信登入賬戶) |
nvarchar |
50 |
ToUserId |
接收者賬號(微信暱稱);可多個,英文逗號分隔。 |
nvarchar |
50 |
GroupId |
分組標識 |
nvarchar |
50 |
五、適用條件
本外掛所適用的微信版本號為6.1(含)以上。
本外掛適用於iOS 和 Android作業系統,除檔案上傳無法適用於Android版微信。