国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

B/S(Web)實(shí)時通訊解決方案分享

2019-11-19 16:54:55
字體:
供稿:網(wǎng)友

B/S的實(shí)時通訊實(shí)現(xiàn)起來比較麻煩,因為http協(xié)議是無狀態(tài)的,導(dǎo)致一些實(shí)時消息通知和聊天等功能比較難以實(shí)現(xiàn),本文主要簡述幾種自己之前常用的幾種方式。

1、傳統(tǒng)的HTTP協(xié)議是無狀態(tài)的

傳統(tǒng)的HTTP協(xié)議是無狀態(tài)的,每次請求(request)都要由客戶端(如 瀏覽器)主動發(fā)起,服務(wù)端進(jìn)行處理后返回response結(jié)果,而服務(wù)端很難主動向客戶端發(fā)送數(shù)據(jù),多個用戶進(jìn)行實(shí)時的交流也比較困難,比如聊天系統(tǒng)。

2、目前比較流量的實(shí)時通訊方式

輪詢

條件:任何Web端

客戶端定時向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后馬上返回響應(yīng)信息并關(guān)閉連接。

長輪詢

條件:任何Web端

客戶端向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后hold住連接,直到有新消息才返回響應(yīng)信息并關(guān)閉連接,客戶端處理完響應(yīng)信息后再向服務(wù)器發(fā)送新的請求。

Flash socket

條件:需要安裝Flash插件

在頁面中內(nèi)嵌入一個使用了Socket類的 Flash 程序JavaScript通過調(diào)用此Flash程序提供的Socket接口與服務(wù)器端的Socket接口進(jìn)行通信,JavaScript在收到服務(wù)器端傳送的信息后控制頁面的顯示。

Web Socket

條件:支持H5 Web socket

WebSocket protocol 是HTML5一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duple)。一開始的握手需要借助HTTP請求完成。

3、B/S 實(shí)時通訊輪詢方式

3.1傳統(tǒng)輪詢

客戶端定時向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后馬上返回響應(yīng)信息并關(guān)閉連接。

缺點(diǎn):耗費(fèi)資源,耗費(fèi)流量 。根據(jù)用戶窗口數(shù)量,請求次數(shù)成倍的增加。

3.2 傳統(tǒng)長輪詢

客戶端向服務(wù)器發(fā)送Ajax請求,服務(wù)器接到請求后hold住鏈接,直到有新消息才返回響應(yīng)信息并關(guān)閉連接,客戶端處理完響應(yīng)信息后再向服務(wù)器發(fā)送新的請求。

由于瀏覽器同時只能有一定數(shù)量的鏈接同時hold,所有這種方式如果窗口打開多個,就會導(dǎo)致后面打開的窗口一直等待前面hold的鏈接。

3.3傳統(tǒng)長輪詢+ActiveMq

ActiveMq的方式相比傳統(tǒng)的查詢數(shù)據(jù)庫有一定的優(yōu)勢,這樣減少了多次查詢數(shù)據(jù)庫的問題,效率也會有所提升。但是這種方式每個用戶的每個窗口都會有個訂閱和鏈接,這樣導(dǎo)致ActiveMq服務(wù)器的鏈接數(shù)會隨著用戶的增加而增加,最后導(dǎo)致鏈接數(shù)沾滿。

4、ASP.NETSignalR

很明顯輪詢的方式并不是最好的解決方式,當(dāng)然web socket是一種很好的實(shí)現(xiàn)方式,但是編程起來比較麻煩,由于lz是做.net開發(fā),所以選擇了ASP.NET SignalR。而且SignalR會兼容各種瀏覽器,如果瀏覽器支持web socket,則用web socket方式,如果不支持則用長輪詢的方式實(shí)現(xiàn)。

ASP.NET SignalR 是為 ASP.NET 開發(fā)人員提供的一個庫,可以簡化開發(fā)人員將實(shí)時 Web 功能添加到應(yīng)用程序的過程。實(shí)時 Web 功能是指這樣一種功能:當(dāng)所連接的客戶端變得可用時服務(wù)器代碼可以立即向其推送內(nèi)容,而不是讓服務(wù)器等待客戶端請求新的數(shù)據(jù)。即你有信息了再來通知我,而不是我傻乎乎的每次跑來問你。

http://signalr.net/

4.1 SignalR 簡單編程

SignalR的配置以及應(yīng)用詳情可以參數(shù)官方文檔,這里只做簡單的發(fā)送消息和接收消息的示例。

1、客戶端發(fā)送消息至服務(wù)端

2、服務(wù)端發(fā)送消息至客戶端

在服務(wù)端向客戶端發(fā)送消息時可以選擇三種發(fā)送方式

1、All:所有頁面,比如:實(shí)時股票信息。

  Clients.All.xx();

2、Client:單個頁面,比如:聊天系統(tǒng)。

  Clients.Client("connectionId").xx();

3、Group:組,比如:同一個用戶所有頁面收到通知。

  Clients.Group("groupName").xx();

更多關(guān)于SignalR的詳情介紹,和實(shí)現(xiàn)群聊功能,可以參考另一篇 應(yīng)用并實(shí)現(xiàn)群聊功能 開源代碼

4.2 SignalR+數(shù)據(jù)庫

這種方式解決了用戶多個窗口不能收到消息的問題,而且數(shù)據(jù)庫的刷新頻率只會有一個線程刷新,并不會隨著用戶的增加而增加,從而大大的減小了數(shù)據(jù)庫的刷新頻率。

4.3SignalR+ActiveMq(最終解決方式)

這種方式既解決了鏈接數(shù)的問題,也同時解決了用戶多個窗口不能收到消息的問題,而且用了ActiveMq也不用去實(shí)時刷新數(shù)據(jù)庫。

結(jié)語

以上是lz在開發(fā)中應(yīng)用的多種B/S實(shí)時通信的解決方案,望對各位有所幫助,本文原創(chuàng),歡迎拍磚和推薦。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蕲春县| 乌拉特中旗| 娄底市| 广河县| 海门市| 堆龙德庆县| 德兴市| 莱州市| 武邑县| 黔西县| 吉木萨尔县| 静安区| 闽清县| 海原县| 侯马市| 嘉义市| 冀州市| 德惠市| 罗源县| 长沙县| 开化县| 通州区| 枣庄市| 菏泽市| 河北区| 宣武区| 武宁县| 紫金县| 桐梓县| 斗六市| 隆回县| 博爱县| 彭州市| 康定县| 内乡县| 循化| 驻马店市| 双江| 灵宝市| 富宁县| 长白|