這是一個極其簡陋的聊天室!
這個例子只是在官方的例子上加了 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, "&").replace(/</g, "<").replace(/>/g, ">"); 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 的概念,可以實現多個聊天室功能.