1. 程式人生 > >ASP.NET Core 2.2 基礎知識(十七) SignalR 一個極其簡陋的聊天室

ASP.NET Core 2.2 基礎知識(十七) SignalR 一個極其簡陋的聊天室

定義 ner 下載 end cte ole 文檔 invoke div

這是一個極其簡陋的聊天室!

這個例子只是在官方的例子上加了 Group 的用法而已,主要是官方給的 Group 的例子就兩行代碼,看不出效果.

第一步:修改 chat.js

"use strict";

//創建一個連接
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

//定義客戶端的 ReceiveMessage 方法
connection.on("ReceiveMessage", function (user, message) {
    var msg = message.replace(/&/g, "
&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); var encodedMsg = user + " says " + msg; var li = document.createElement("li"); li.textContent = encodedMsg; document.getElementById("messagesList").appendChild(li); }); //給"Send Message"按鈕添加點擊事件 document.getElementById("
sendButton").addEventListener("click", function (event) { var user = document.getElementById("userInput").value; var message = document.getElementById("messageInput").value; //調用服務端的 SendMessage 方法 connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); });
event.preventDefault(); }); //給"進入聊天室"按鈕添加點擊事件 document.getElementById("goChatRoom").addEventListener("click", function () { goChatRoom();//開啟連接 document.getElementById("outChatRoom").style.display = "block"; this.style.display = "none"; }); //給"退出聊天室"按鈕添加點擊事件 document.getElementById("outChatRoom").addEventListener("click", function () { outChatRoom();//關閉連接 this.style.display = "none"; document.getElementById("goChatRoom").style.display = "block"; }); //開啟連接 function goChatRoom() { connection.start().catch(function (err) { return console.error(err.toString()); }); } //關閉連接 function outChatRoom() { connection.stop(); }

第二步:定義強類型中心

    public interface IChatClient
    {
        //就算是這種強類型方式,客戶端定義的方法名也必須和這個方法名一樣,包括簽名.
        Task ReceiveMessage(string user, string message);
    }

    public class StronglyTypedChatHub : Hub<IChatClient>
    {
        public async Task SendMessage(string user, string message)
        {
            //向所有連接的客戶端中,在 "room" 小組的客戶端發送消息
            await Clients.Group("room").ReceiveMessage(user, message);
        }

        public override async Task OnConnectedAsync()
        {
            //當客戶端連接上後,將其歸屬到 "room" 小組.
            await Groups.AddToGroupAsync(Context.ConnectionId, "room");
            await base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            //當客戶端斷開連接後,將其從 "room" 小組移除,一定要移除!不然會發送多條消息!!!!
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, "room");
            await base.OnDisconnectedAsync(exception);
        }
    }

第三步:註冊 SignalR 服務,添加路由

        public void ConfigureServices(IServiceCollection services)
        {
            ......
            services.AddSignalR();
            ......
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ......
            app.UseSignalR(routes => { routes.MapHub<StronglyTypedChatHub>("/chatHub"); });

            app.UseMvc();
        }

第四步:下載 singalr.js (略,可參照官方文檔)

效果:

在沒有進入聊天室的時候,點擊 "Send Message" 是沒有效果的:

技術分享圖片

1 進入聊天室:

技術分享圖片

2 也進入聊天室

技術分享圖片

其實我覺得用這個 Group 的概念,可以實現多個聊天室功能.

ASP.NET Core 2.2 基礎知識(十七) SignalR 一個極其簡陋的聊天室