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


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

這個例子只是在官方的例子上加了 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 的概念,可以實現多個聊天室功能.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM