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中,被通知觸發方法
由龐順龍最後編輯於:4年前
內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。
相關文章
- SignalR簡版web聊天室(demo簡單演示篇)SignalRWeb
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室 實戰系列。開源啦!!!ASP.NETSignalRWeb
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室 實戰系列(內容已過期,閱讀請慎重)ASP.NETSignalRWeb
- ASP.NET SignalR 與LayIM配合,輕鬆實現網站客服聊天室(二) 實現聊天室連線ASP.NETSignalR網站
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(零) 前言(內容已過期,閱讀請慎重)ASP.NETSignalRWeb
- SignalR實現web線上即時聊天(C#)SignalRWebC#
- 用node實現一個簡單的聊天室—— 升級版
- 簡版排程中心搭建及實現思路
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(十四)之漏掉的客服訊息ASP.NETSignalRWeb
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(三) 之 實現單聊,群聊,傳送圖片,檔案。ASP.NETSignalRWeb
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(十三)之附加功能-自定義皮膚ASP.NETSignalRWeb
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- SignalR來做實時Web聊天SignalRWeb
- android中foreground水波實現過程分析Android
- promise實現過程Promise
- jQuery實現的簡單焦點圖特效實現過程詳解jQuery特效
- java實現手機簡訊驗證全過程Java
- micropython TPYBoard v201 簡易的web伺服器的實現過程PythonWeb伺服器
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(十一) 程式碼重構使用反射工廠解耦ASP.NETSignalRWeb反射解耦
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(十) 之 自定義系統訊息和總結ASP.NETSignalRWeb
- WinForm的Socket實現簡單的聊天室 IMORM
- PHP實現最簡單的聊天室應用PHP
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(六) 之 Layim原始碼改造右鍵選單--好友、組管理功能的實現。ASP.NETSignalRWeb原始碼
- crtmpserver 執行過程簡明分析Server
- 實時web應用方案——SignalR(.net core)WebSignalR
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(四) 之 使用者搜尋(Elasticsearch),加好友流程(1)。ASP.NETSignalRWebElasticsearch
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(八) 之 用 Redis 實現使用者線上離線狀態訊息處理ASP.NETSignalRWebRedis
- KVC、KVO實現過程
- HIVE實現wordcount過程Hive
- 【SignalR全套系列】之在.Net Core 中實現SignalR實時通訊SignalR
- Signalr自託管最簡實踐SignalR
- 如何實現一個簡易版的 Spring - 如何實現 AOP(終結篇)Spring
- Python基於Socket實現簡易多人聊天室Python
- Web SSH 的原理與在 ASP.NET Core SignalR 中的實現WebASP.NETSignalR
- 用node實現一個簡單的聊天室——websocket實踐Web
- PHP 協程實現過程詳解PHP
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(九) 之 用 Redis 實現使用者線上離線狀態訊息處理(一)ASP.NETSignalRWebRedis
- ASP.NET SignalR 與 LayIM2.0 配合輕鬆實現Web聊天室(五) 之 加好友,加群流程,訊息管理和即時訊息提示的實現ASP.NETSignalRWeb