B/S的實時通信實現起來比較麻煩,由於http協議是無狀態的,致使一些實時消息通知和聊天等功能比較難以實現,本文主要簡述幾種本身以前經常使用的幾種方式。web
傳統的HTTP協議是無狀態的,每次請求(request)都要由客戶端(如 瀏覽器)主動發起,服務端進行處理後返回response結果,而服務端很難主動向客戶端發送數據,多個用戶進行實時的交流也比較困難,好比聊天系統。數據庫
條件:任何Web端編程
客戶端定時向服務器發送Ajax請求,服務器接到請求後立刻返回響應信息並關閉鏈接。瀏覽器
條件:任何Web端服務器
客戶端向服務器發送Ajax請求,服務器接到請求後hold住鏈接,直到有新消息才返回響應信息並關閉鏈接,客戶端處理完響應信息後再向服務器發送新的請求。socket
條件:須要安裝Flash插件spa
在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript經過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通訊,JavaScript在收到服務器端傳送的信息後控制頁面的顯示。.net
條件:支持H5 Web socket插件
WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通訊(full-duple)。一開始的握手須要藉助HTTP請求完成。線程
客戶端定時向服務器發送Ajax請求,服務器接到請求後立刻返回響應信息並關閉鏈接。
缺點:耗費資源,耗費流量 。根據用戶窗口數量,請求次數成倍的增長。
客戶端向服務器發送Ajax請求,服務器接到請求後hold住連接,直到有新消息才返回響應信息並關閉鏈接,客戶端處理完響應信息後再向服務器發送新的請求。
因爲瀏覽器同時只能有必定數量的連接同時hold,全部這種方式若是窗口打開多個,就會致使後面打開的窗口一直等待前面hold的連接。
ActiveMq的方式相比傳統的查詢數據庫有必定的優點,這樣減小了屢次查詢數據庫的問題,效率也會有所提高。可是這種方式每一個用戶的每一個窗口都會有個訂閱和連接,這樣致使ActiveMq服務器的連接數會隨着用戶的增長而增長,最後致使連接數沾滿。
很明顯輪詢的方式並非最好的解決方式,固然web socket是一種很好的實現方式,可是編程起來比較麻煩,因爲lz是作.net開發,因此選擇了ASP.NET SignalR。並且SignalR會兼容各類瀏覽器,若是瀏覽器支持web socket,則用web socket方式,若是不支持則用長輪詢的方式實現。
ASP.NET SignalR 是爲 ASP.NET 開發人員提供的一個庫,能夠簡化開發人員將實時 Web 功能添加到應用程序的過程。實時 Web 功能是指這樣一種功能:當所鏈接的客戶端變得可用時服務器代碼能夠當即向其推送內容,而不是讓服務器等待客戶端請求新的數據。即你有信息了再來通知我,而不是我傻乎乎的每次跑來問你。
SignalR的配置以及應用詳情能夠參數官方文檔,這裏只作簡單的發送消息和接收消息的示例。
在服務端向客戶端發送消息時能夠選擇三種發送方式
一、All:全部頁面,好比:實時股票信息。
Clients.All.xx();
二、Client:單個頁面,好比:聊天系統。
Clients.Client("connectionId").xx();
三、Group:組,好比:同一個用戶全部頁面收到通知。
Clients.Group("groupName").xx();
這種方式解決了用戶多個窗口不能收到消息的問題,並且數據庫的刷新頻率只會有一個線程刷新,並不會隨着用戶的增長而增長,從而大大的減少了數據庫的刷新頻率。
這種方式既解決了連接數的問題,也同時解決了用戶多個窗口不能收到消息的問題,並且用了ActiveMq也不用去實時刷新數據庫。
以上是lz在開發中應用的多種B/S實時通訊的解決方案,望對各位有所幫助。