亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ASP.NET?Core實(shí)時(shí)庫(kù)SignalR簡(jiǎn)介及使用

 更新時(shí)間:2022年01月07日 11:43:33   作者:老馬-Max  
這篇文章介紹了ASP.NET?Core實(shí)時(shí)庫(kù)SignalR簡(jiǎn)介及使用方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

何為實(shí)時(shí)

先從理論上解釋一下兩者的區(qū)別。

大多數(shù)傳統(tǒng)的web應(yīng)用是這樣的:客戶端發(fā)起http請(qǐng)求到服務(wù)端,服務(wù)端返回對(duì)應(yīng)的結(jié)果。像這樣:

也就是說,傳統(tǒng)的web應(yīng)用都是客戶端主動(dòng)發(fā)起請(qǐng)求到服務(wù)端。

那么實(shí)時(shí)web應(yīng)用呢?它不需要主動(dòng)發(fā)起請(qǐng)求,服務(wù)端可以主動(dòng)推送信息到客戶端。

舉栗子的話,實(shí)時(shí)聊天工具、web游戲等都可以算是實(shí)時(shí)應(yīng)用。

什么是SignalR

如果想做一個(gè)實(shí)時(shí)應(yīng)用,最好用web socket。很早以前我也寫過web socket的實(shí)現(xiàn)方式,但不夠全面,這里再補(bǔ)上一篇。

來說說signalR,它是一款開源的實(shí)時(shí)框架,可以使用三種方式實(shí)現(xiàn)通信(long polling、server sent events、web socket)。它很好的整合了底層技術(shù),讓我們可以不用關(guān)注底層技術(shù)實(shí)現(xiàn)而把精力聚焦在業(yè)務(wù)實(shí)現(xiàn)上。一個(gè)完整的signalR包括客戶端和服務(wù)端,服務(wù)端支持net core/net framework,還支持大部分客戶端,比如瀏覽器和桌面應(yīng)用。

回落機(jī)制

為了兼容不同瀏覽器(客戶端)和服務(wù)端,signalR采用了回落機(jī)制,使得它可以根據(jù)情況協(xié)商使用不同的底層傳輸方式。假如瀏覽器不支持web socket,就自動(dòng)降級(jí)使用sse,再不行就long polling。當(dāng)然,也可以禁用這種機(jī)制,指定其中一種。

三種通信方式

long polling(長(zhǎng)輪詢)

長(zhǎng)輪詢是客戶端發(fā)起請(qǐng)求到服務(wù)端,服務(wù)器有數(shù)據(jù)就會(huì)直接返回。如果沒有數(shù)據(jù)就保持連接并且等待,一直到有新的數(shù)據(jù)返回。如果請(qǐng)求保持到一段時(shí)間仍然沒有返回,這時(shí)候就會(huì)超時(shí),然后客戶端再次發(fā)起請(qǐng)求。

這種方式優(yōu)點(diǎn)就是簡(jiǎn)單,缺點(diǎn)就是資源消耗太多,基本是不考慮的。

server sent events(sse)

如果使用了sse,服務(wù)器就擁有了向客戶端推送的能力,這些信息和流信息差不多,期間會(huì)保持連接。

這種方式優(yōu)點(diǎn)還是簡(jiǎn)單,也支持自動(dòng)重連,綜合來講比long polling好用。缺點(diǎn)也很明顯,不支持舊的瀏覽器不說,還只能發(fā)送本文信息,而且瀏覽器對(duì)sse還有連接數(shù)量的限制(6個(gè))。

web socket

web socket允許客戶端和服務(wù)端同時(shí)向?qū)Ψ桨l(fā)送消息(也就是雙工通信),而且不限制信息類型。雖然瀏覽器同樣有連接數(shù)量限制(可能是50個(gè)),但比sse強(qiáng)得多。理論上最優(yōu)先使用。

進(jìn)入正題

開始之前,還需要了解RPC和Hub的概念。

  • RPC:全稱Remote Procedure Call,字面意思遠(yuǎn)程服務(wù)調(diào)用,可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)。前端可以調(diào)用后端方法,后端也可以調(diào)用前端方法。
  • Hub:基于RPC,接受從客戶端發(fā)過來的消息,也同時(shí)負(fù)責(zé)把服務(wù)端的消息發(fā)送給客戶端。客戶端可以調(diào)用Hub里面的方法,服務(wù)端可以通過Hub調(diào)用客戶端里面的方法。

好了,概念已經(jīng)理解清楚了,接下來上代碼。

在項(xiàng)目里新增Hub類:

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace SignalRDemo.Server
{
    public class SignalRHub : Hub
    {
        /// <summary>
        /// 客戶連接成功時(shí)觸發(fā)
        /// </summary>
        /// <returns></returns>
        public override async Task OnConnectedAsync()
        {
            var cid = Context.ConnectionId;

            //根據(jù)id獲取指定客戶端
            var client = Clients.Client(cid);

            //向指定用戶發(fā)送消息
            await client.SendAsync("Self", cid);

            //像所有用戶發(fā)送消息
            await Clients.All.SendAsync("AddMsg", $"{cid}加入了聊天室");
        }
    }
}

為了讓外部可以訪問,我們還需要一個(gè)控制器。在控制器里聲明隨便建一個(gè):

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using SignalRDemo.Server;
using System.Threading.Tasks;

namespace SignalRDemo.Controllers
{
    public class HomeController : Controller
    {
        private readonly IHubContext<SignalRHub> _countHub;

        public HomeController(IHubContext<SignalRHub> countHub)
        {
            _countHub = countHub;
        }

        /// <summary>
        /// 發(fā)送信息
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task Send(string msg, string id)
        {
            await _countHub.Clients.All.SendAsync("AddMsg", $"{id}:{msg}");
        }
    }
}

再然后進(jìn)入StartUp設(shè)置端點(diǎn):

endpoints.MapHub<SignalRHub>("/hub");

完成以后,配置signalr客戶端:

setupConn = () => {
    conn = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();

    conn.on("AddMsg", (obj) => {
        $('#msgPanel').append(`<p>${obj}</p>`);
    });

    conn.on("Finished", () => {
        conn.stop();
        $('#msgPanel').text('log out!');
    });

    conn.on("Self", (obj) => {
        $('#userId').text(obj);
    });

    conn.start()
        .catch(err => console.log(err));
}

要注意withUrl里面的路徑就是之前設(shè)置好的端點(diǎn)。

運(yùn)行效果:

Hub還支持組操作,比如:

//將用戶添加到A組
await Groups.AddToGroupAsync(Context.ConnectionId, "GroupA");
//將用戶踢出A組
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "GroupA");
//向A組所有成員廣播消息
await Clients.Group("GroupA").SendAsync("AddMsg", "群組消息");

更多操作請(qǐng)參考官方文檔。

本文演示demo的源碼見git,地址:https://gitee.com/muchengqingxin/SignalRDemo.git

到此這篇關(guān)于ASP.NET Core實(shí)時(shí)庫(kù)SignalR簡(jiǎn)介及使用的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論