SignalR簡版web聊天室(實現過程分析篇)
接上一篇:基於asp.net+SignalR實現的簡版web聊天室(demo簡單演示篇)
簡單來說:SignalR的使用重點其實就是hub類方法觸發頁面js和頁面js呼叫hub類方法的互通。
1、新建專案
2、引入必須的js
<script src="Scripts/jquery-1.6.4.min.js"></script> <script src="Scripts/jquery.signalR-2.2.0.min.js"></script> <script src="signalr/hubs"></script>
3、使用nuget工具,向專案新增SignalR
4、新建hub類
5、講解群發公聊資訊實現過程
hub類新增sendAll方法
//廣播資訊到所有clinet public void SendAllServer(string name, string message) { Clients.All.SendAllClient("<li>[" + name + "]:" + message + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</li>"); }
頁面新增SignalR指令碼
$(function () { var chat = $.connection.PascalCaseContosoChatHub; chat.client.sendAllClient = function (message) { $('#chatList').append(message); }; $.connection.hub.start().done(function () { $('#sendmessage').click(function () { if ($('#message').val() == "") { alert("請輸入資訊後再傳送"); return; } if ($("#hiddenToConnectionId").val() == "") { chat.server.sendAllServer($('#hiddenUserName').val(), $('#message').val()); } else { chat.server.sendToSingle($("#hiddenToConnectionId").val(), $('#hiddenUserName').val(), $("#hiddenToUserName").val(), $('#message').val()); } $('#message').val("").focus(); }); }).fail(function () { $('#chatList').append('<li><strong>' + encodedName + '</strong>:連線聊天伺服器失敗...</li>'); }); });
說明:
var chat = $.connection.PascalCaseContosoChatHub; 是註冊頁面連結方法。
Clients.All.SendAllClient 方法會觸發所有頁面chat.client.sendAllClient方法,進行訊息追加。
也就是說:在cs類中使用Client.xxx.自定義方法名稱 與 頁面 js chat.client.sendAllClient 進行呼叫。
規則:camel 命名法,也就是說,cs類中是 SendAll方法,那麼js中就是chat.client.sendAll 進行呼叫。
這樣就實現了,cs類方法觸發所有client進行訊息的追加,也就是公聊。
6、私聊和其他方法說明
//所有人 Clients.All.addContosoChatMessageToPage(name, message); //觸發者 Clients.Caller.addContosoChatMessageToPage(name, message); //所有人除了觸發者 Clients.Others.addContosoChatMessageToPage(name, message); //根據ConnectionId,實現私聊的方式 Clients.Client(Context.ConnectionId).addContosoChatMessageToPage(name, message); //所有人,除了指定的connectionId1,connectionId2 Clients.AllExcept(connectionId1, connectionId2).addContosoChatMessageToPage(name, message); //一組可見,用於小組聊天 Clients.Group(groupName).addContosoChatMessageToPage(name, message); //一組可見,用於小組聊天,除了指定的connectionId1,connectionId2 Clients.Group(groupName, connectionId1, connectionId2).addContosoChatMessageToPage(name, message); //除了當前組其他可見 Clients.OthersInGroup(groupName).addContosoChatMessageToPage(name, message); //指定userid可見 Clients.User(userid).addContosoChatMessageToPage(name, message); //指定的ConnectionIds,注意,這裡是一組ConnectionIds,不是一個ConnectionId Clients.Clients(ConnectionIds).broadcastMessage(name, message); //指定的組,多個 Clients.Groups(GroupIds).broadcastMessage(name, message); //根據使用者name Clients.Client(username).broadcastMessage(name, message); //一組使用者name可見 Clients.Users(new string[] { "myUser", "myUser2" }).broadcastMessage(name, message);
我上一篇文章demo演示中用到的有:
① 使用到了 Clients.Client,用於展示私聊資訊
//傳送資訊給單一client的人 public void SendToSingle(string toConnectionID, string fromName, string toName, string message) { Clients.Client(toConnectionID).SendToSingleClient("<li class='green_li'>[" + fromName + "]對你說:" + message + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</li>"); Clients.Client(Context.ConnectionId).SendFromSingleClient("<li class='green_li'>你對[" + toName + "]說:" + message + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</li>"); }
② 當前使用者加入聊天室,當前使用者不顯示xxx加入了聊天室,其他client顯示,用 Clients.AllExcept(connectionID)
//新使用者加入系統訊息 public void SystemNotice(string connectionID, string username, string type) { if (type.Equals("1")) { Clients.AllExcept(connectionID).SystemNoticeClient("<li class='red_li'>系統訊息:" + username + " 加入聊天室 - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</li>"); } else { Clients.AllExcept(connectionID).SystemNoticeClient("<li class='red_li'>系統訊息:" + username + " 退出了聊天室 - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</li>"); } }其他的自行根據需求使用即可
7、client傳送聊天資訊流程分析
①、client傳送聊天資訊通過js到cs類方法
②、hub類進行不同分類處理
③、hub類方法接收到資訊後,通知對應的client進行資料接收
公聊就是Clients.All.SendAllClient,那麼所有連線中的client頁面都會被通知觸發
④、私聊簡單說明,其實私聊和公聊類似,只是在hub類方法通知的client是唯一的一個client而已
在頁面js中,被通知觸發方法
由請喊我大龍哥最後編輯於:3年前
內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。
相關文章
- SignalR簡版web聊天室(demo簡單演示篇)SignalRWeb
- android中foreground水波實現過程分析Android
- 用node實現一個簡單的聊天室—— 升級版
- micropython TPYBoard v201 簡易的web伺服器的實現過程PythonWeb伺服器
- 簡版排程中心搭建及實現思路
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- 實時web應用方案——SignalR(.net core)WebSignalR
- 【SignalR全套系列】之在.Net Core 中實現SignalR實時通訊SignalR
- crtmpserver 執行過程簡明分析Server
- Signalr自託管最簡實踐SignalR
- Web SSH 的原理與在 ASP.NET Core SignalR 中的實現WebASP.NETSignalR
- promise實現過程Promise
- java實現手機簡訊驗證全過程Java
- Web實時通訊,SignalR真香,不用愁了WebSignalR
- WinForm的Socket實現簡單的聊天室 IMORM
- Python基於Socket實現簡易多人聊天室Python
- Spring AOP實現過程Spring
- 基於SpringBoot+STOMP協議實現的web聊天室Spring Boot協議Web
- 如何實現一個簡易版的 Spring - 如何實現 AOP(終結篇)Spring
- 透過.NET Core+Vue3 實現SignalR即時通訊功能VueSignalR
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- SpringBoot2 整合 WebSocket 簡單實現聊天室功能Spring BootWeb
- 用node實現一個簡單的聊天室——websocket實踐Web
- Web請求過程Web
- 【進階篇】基於 Redis 實現分散式鎖的全過程Redis分散式
- 手寫IOC實現過程
- 手寫AOP實現過程
- 換膚功能實現過程
- C# 使用SignalR實現訊息通知C#SignalR
- 精簡版 koa 簡單實現
- 詳細分析連結串列的資料結構的實現過程(Java 實現)資料結構Java
- flink1.10版本StreamGraph生成過程分析
- 簡單版Promise實現Promise
- 簡易版 vue實現Vue
- 實時通訊系列目錄篇之SignalR詳解SignalR
- 原生Node 實現聊天室
- Ubuntu20.04linux核心(5.4.0版本)編譯準備與實現過程-編譯過程(2)UbuntuLinux編譯
- 詳細分析棧和佇列的資料結構的實現過程(Java 實現)佇列資料結構Java