Asp.net SignalR是微軟為實現實時通信的一個類庫。一般情況下,SignalR會使用JavaScript的長輪詢(long polling)的方式來實現客戶端和服務器通信,隨着Html5中WebSockets出現,SignalR也支持WebSockets通信。另外SignalR開發的程序不僅僅限制於宿主在IIS中,也可以宿主在任何應用程序,包括控制台,客戶端程序和Windows服務等,另外還支持Mono,這意味着它可以實現跨平台部署在Linux環境下。
SignalR內部有兩類對象:
- Http持久連接(Persisten Connection)對象:用來解決長時間連接的功能。還可以由客戶端主動向服務器要求數據,而服務器端不需要實現太多細節,只需要處理PersistentConnection 內所提供的五個事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。
- Hub(集線器)對象:用來解決實時(realtime)信息交換的功能,服務端可以利用URL來注冊一個或多個Hub,只要連接到這個Hub,就能與所有的客戶端共享發送到服務器上的信息,同時服務端可以調用客戶端的腳本。
SignalR將整個信息的交換封裝起來,客戶端和服務器都是使用JSON來溝通的,在服務端聲明的所有Hub信息,都會生成JavaScript輸出到客戶端,.NET則依賴Proxy來生成代理對象,而Proxy的內部則是將JSON轉換成對象。
消息提醒也就是當客戶有新消息來時,在客戶端的右下角進行彈框提醒。要實現這個功能的思路是:
- SignalR服務端推送消息到客戶端的實現方式為調用客戶端的receiveMessage方法來將消息附加到聊天記錄內,所以我們可以在客戶端的receiveMessage方法中實現彈框的邏輯。
- 找好了方法定義的位置后,自然是去找一個比較好的彈框效果JS類庫了,這里使用的是iNotify庫來實現的。該庫的github地址為:https://github.com/jaywcjlove/iNotify,在線測試地址為:http://jslite.io/iNotify/
- 你看QQ或者微信的消息提醒,消息提醒一般是在你不在聊天的當前Tab頁面才會彈出,我們可以利用Html5 visibilitychange事件來實現,不過我這里是通過失焦點的方式,也就是focus事件。
JavaScript
// 接收消息 systemHub.client.receivePrivateMessage = function(fromUserId, userName, message) { // 專題二中的代碼 // 消息提醒的代碼 if (active == false) { var iN = new iNotify({ effect: 'flash', interval: 500, audio: { file: ['/Music/msg.mp3'] }, notification: { title: "通知!", body: '您有一條新消息' } }); iN.setTitle(true).player(); iN.setFavicon(true).setTitle(true).notify(); } }; }