1. 程式人生 > >微信外掛之即時通訊系統設計

微信外掛之即時通訊系統設計

一、前言

微信是目前最流行的即時通訊工具之一,同時在微門戶、企業管理等方面進行社交平臺應用的擴充套件,尤其是企業號的釋出,更確立了微信作為企業資訊化管理的一種延伸和支援。

二、功能特點

本文將圍繞需求之一,即內部群組聊天展開,具體功能包括:

1、       多群組聊天,使用者基於微信通訊錄;

2、       支援表情功能;

3、       可以傳送文字、圖片、檔案、視訊等資訊;(其中圖片、檔案、視訊作為二期實現);

4、       聊天曆史記錄查詢;

三、功能設計

1、整體框架

1)       模組定義


2)       元件定義

整個外掛系統主要包含以下幾個元件(類似於vs的專案工程):


2、資料通訊流程

聊天的資訊互動都採用業界即時通訊普遍的方式,Socket通訊模式實現,整體框架分客戶端和伺服器端:

Ø  客戶端採用html5中的WebSocket元件;

Ø  伺服器端採用C#編寫,並以window服務的方式部署和執行;

通訊流程:


1)       客戶端連線

客戶端在第一次連線時,通知伺服器端,進行“握手”操作。傳送的資料包格式定義:

<wxchatmessage>
         <action>connect</action>
         <!--群組id-->
         <groupid></groupid>   
         <!--傳送者標識-->
         <fromusesrid></fromusesrid >   
         <type>text</type>
         <content>內容</content>
         <createdatetime>傳送時間</createdatetime>
</wxchatmessage >


返回結果:

<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版微信。