欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET?Core實(shí)時庫SignalR簡介及使用

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

何為實(shí)時

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

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

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

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

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

什么是SignalR

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

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

回落機(jī)制

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

三種通信方式

long polling(長輪詢)

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

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

server sent events(sse)

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

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

web socket

web socket允許客戶端和服務(wù)端同時向?qū)Ψ桨l(fā)送消息(也就是雙工通信),而且不限制信息類型。雖然瀏覽器同樣有連接數(shù)量限制(可能是50個),但比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ā)過來的消息,也同時負(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>
        /// 客戶連接成功時觸發(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}加入了聊天室");
        }
    }
}

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

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", "群組消息");

更多操作請參考官方文檔。

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

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

相關(guān)文章

最新評論