即時(shí)通信系統(tǒng)中如何實(shí)現(xiàn):全局系統(tǒng)通知,并與Web后臺(tái)集成?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
像QQ這樣的即時(shí)通信軟件,時(shí)不時(shí)就會(huì)從桌面的右下角彈出一個(gè)小窗口,或是顯示一個(gè)廣告、或是一個(gè)新聞、或是一個(gè)公告等。在這里,我們將其統(tǒng)稱為“全局系統(tǒng)通知”。很多使用GGTalk的朋友都建議我加上一個(gè)類似的功能,今天,GGTalk 5.1終于實(shí)現(xiàn)了這一功能,并且可以通過Web后臺(tái)發(fā)送全局系統(tǒng)通知。下面,我們將一步步講述這一功能是如何實(shí)現(xiàn)的(通過類似同樣的步驟,大家可以為GGTalk添加任意的自己需要的功能)。 1.定義消息類型和協(xié)議類我們將全局系統(tǒng)通知分為兩類: (1)第一種通知,是發(fā)給所有用戶的。 (2)第二種通知,是發(fā)給指定群組(Group)中的用戶的。 基于此,我們需要定義兩種消息類型,于是,我們?cè)贕GTalk.Core項(xiàng)目中的InformationTypes 類下增加兩個(gè)常量: /// 為了簡便,我們讓兩個(gè)類型的消息公用同一個(gè)協(xié)議類,在GGTalk.Core項(xiàng)目中增加SystemNotifyContract類: /// 2.客戶端發(fā)送系統(tǒng)通知(1)我們需要定義用于輸入系統(tǒng)通知的標(biāo)題和內(nèi)容的窗體,具體可參見GGTalk項(xiàng)目下的SystemNotifySendForm,當(dāng)點(diǎn)擊窗體上的“發(fā)送”按鈕時(shí): private void btnSend_Click(object sender, EventArgs e) { try { SystemNotifyContract contract = new SystemNotifyContract(this.skinTextBox_id.Text, this.richTextBox1.Text, this.rapidPassiveEngine.CurrentUserID, this.skinTextBox_groupID.Text); byte[] data = CompactPropertySerializer.Default.Serialize(contract); int infoType = this.skinRadioButton_group.Checked ? InformationTypes.SystemNotify4Group : InformationTypes.SystemNotify4AllOnline; this.rapidPassiveEngine.CustomizeOutter.Send(infoType, data); MessageBox.Show("發(fā)送成功!"); this.Close(); } catch (Exception ee) { MessageBox.Show("發(fā)送失敗!" + ee.Message); } } 首先,需要構(gòu)造協(xié)議類實(shí)例,然后使用緊湊的序列化器將其序列化,然后通過用戶的選擇確定是全局系統(tǒng)通知、還是組通知,最后使用通信引擎將消息其發(fā)送給服務(wù)端。 (2)SystemNotifySendForm實(shí)現(xiàn)完成后,我們需要在GGTalk客戶端住窗體的底部的功能菜單上添加一個(gè)“發(fā)送系統(tǒng)通知”的按鈕,當(dāng)點(diǎn)擊該按鈕時(shí),就new一個(gè)SystemNotifySendForm,并顯示出來給用戶輸入。 (3)如果需要,可以為該功能加上適當(dāng)?shù)臋?quán)限控制,比如,只有管理員帳號(hào)登錄GGTalk后,才會(huì)看到“發(fā)送系統(tǒng)通知”的按鈕。 3.服務(wù)端處理當(dāng)服務(wù)端收到來自客戶端的全局系統(tǒng)通知消息時(shí),需要將其廣播出去: (1)如果是全局系統(tǒng)通知(SystemNotify4AllOnline ),則將其發(fā)送給所有在線的用戶。 (2)如果是群組系統(tǒng)通知(SystemNotify4Group),則將其發(fā)送給該組的所有成員。 下面是處理SystemNotify4Group類型消息的代碼(在GGTalk.Server項(xiàng)目的CustomizeHandler類中): if (informationType == InformationTypes.SystemNotify4Group) { SystemNotifyContract contract = CompactPropertySerializer.Default.Deserialize 首先,需要反序列化得到SystemNotifyContract實(shí)例,然后拿到該實(shí)例中的GroupID的值,然后根據(jù)GroupID從緩存獲取該組的所有成員列表,最后,將系統(tǒng)通知轉(zhuǎn)發(fā)給所有這些成員。 4.客戶端顯示系統(tǒng)通知當(dāng)任何一個(gè)在線的GGTalk客戶端收到系統(tǒng)通知消息時(shí),就會(huì)像QQ一樣在屏幕的右下角彈出一個(gè)小窗口,來顯示系統(tǒng)通知的具體內(nèi)容。 (1)我們?cè)贕GTalk項(xiàng)目中增加一個(gè)SystemNotifyForm,用于顯示系統(tǒng)通知的信息。 (2)在客戶端的信息處理器中(在 MainFormPartial.cs 文件中),增加對(duì)SystemNotify4AllOnline 和 SystemNotify4Group消息的處理: if (informationType == InformationTypes.SystemNotify4Group) { SystemNotifyContract contract = CompactPropertySerializer.Default.Deserialize 首先,將byte[]信息反序列化得到SystemNotifyContract,然后將其Title和Content交給SystemNotifyForm去顯示出來。 5.與Web后臺(tái)集成很多時(shí)候,我們的管理員可能都是通過Web后臺(tái)來進(jìn)行系統(tǒng)管理,并發(fā)送系統(tǒng)通知的,這樣,我們的GGTalk就需要與Web后臺(tái)集成到一起。通常,GGTalk與Web的集成是這樣做的:
(1)GGTalk的服務(wù)端GGTalk.Server發(fā)布一個(gè)Remoting服務(wù)。 (2)Web通過調(diào)用GGTalk.Server的Remoting接口來完成與GGTalk的交互。 我們?cè)贕GTalk.Core項(xiàng)目中的IRemotingService接口中增加一個(gè)方法,用于發(fā)送系統(tǒng)通知: /// 并且,在GGTalk.Server項(xiàng)目的RemotingService類中,實(shí)現(xiàn)這個(gè)方法即可。 6.源碼下載GGTalk即時(shí)通信系統(tǒng)是可在廣域網(wǎng)部署運(yùn)行的QQ高仿版,2013.8.7發(fā)布V1.0版本,至今最新是5.1版本,關(guān)于GG更詳細(xì)的介紹以及最新源碼下載,請(qǐng)移步 可在廣域網(wǎng)部署運(yùn)行的QQ高仿版 -- GGTalk總覽。 該文章在 2017/2/7 18:43:08 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |