Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
.NET(Core)
正文
原创
2019-08-22
浏览 (
12453
)
史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天
## 1、概述 ## 通过前面几篇文章 [史上最全面的SignalR系列教程-1、认识SignalR](http://www.guosisoft.com/article/detail/225) [史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式](http://www.guosisoft.com/article/detail/226) [史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式](http://www.guosisoft.com/article/detail/227) [史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例](http://www.guosisoft.com/article/detail/228) [RDIFramework.NET敏捷开发框架通过SignalR技术整合即时通讯(IM)](http://www.guosisoft.com/article/detail/229) 我们对SignalR算入门了,知道如何把SignalR合理应用到实际的项目中。前面的文章主要讲解的是SignalR的概念,托管方式,以及推送的功能。本篇主要讲解通过SignalR实现一对一、点对点的聊天。 ## 2、SignalR一对一聊天实现 ## ### 2.1、 创建ASP.NET Mvc项目 ### 新建一个空的ASP.NET Mvc项目,取名为:SignalROneToOne,如下图所示。为了整个系列的完整性,我们直接在上一项目的基础上新增的一个测试项目,后面有项目的源码托管地址。 ![新建SignalROneToOne测试项目](http://doc.rdiframework.net/blog/article/20190822111400530.png-pw) ### 2.2、安装Nuget包 ### 创建好项目后,要使用SignalR,需要先安装SignalR包,可以通过**程序包管理控制台**输入包安装命令进行安装。 Install-Package Microsoft.AspNet.SignalR 也可以使用界面方式,如下图所示。 ![安装SignalR包-Microsoft.AspNet.SignalR](http://doc.rdiframework.net/blog/article/20190822111439680.png-pw) ### 2.3、一对一聊天后台代码实现### 向工程中添加HubConnections目录,在其中添加OneToOneHub.cs文件,如下图所示: ![添加OneToOneHub](http://doc.rdiframework.net/blog/article/20190822111500163.png-pw) 实现的主要步骤: 1. 重写OnConnected连接方法和OnDisconnected断开方法。 2. 使用SendMessage服务器端方法发送消息,GetName获取用户名。 3. 客户端响应的提示返回信息方法,如Clients.Client(Context.ConnectionId).addMessage(message) OneToOneHub代码内容如下: using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace SignalROneToOneDemo.Connections { /// <summary> /// 用户实体类 /// </summary> public class User { /// <summary> /// 连接ID /// </summary> [Key] public string ConnectionID { get; set; } /// <summary> /// 用户名称 /// </summary> public string Name { get; set; } public User(string name, string connectionId) { this.Name = name; this.ConnectionID = connectionId; } } /// <summary> /// 点对点(一对一)聊天 /// </summary> [HubName("chat")] public class OneToOneHub : Hub { public static List<User> users = new List<User>(); //发送消息 public void SendMessage(string connectionId, string message) { Clients.All.hello(); var user = users.Where(s => s.ConnectionID == connectionId).FirstOrDefault(); if (user != null) { Clients.Client(connectionId).addMessage(message + "" + DateTime.Now, Context.ConnectionId); //给自己发送,把用户的ID传给自己 Clients.Client(Context.ConnectionId).addMessage(message + "" + DateTime.Now, connectionId); } else { Clients.Client(Context.ConnectionId).showMessage("该用户已离线..."); } } [HubMethodName("getName")] public void GetName(string name) { //查询用户 var user = users.SingleOrDefault(u => u.ConnectionID == Context.ConnectionId); if (user != null) { user.Name = name; Clients.Client(Context.ConnectionId).showId(Context.ConnectionId); } GetUsers(); } /// <summary> /// 重写连接事件 /// </summary> /// <returns></returns> public override Task OnConnected() { //查询用户 var user = users.Where(u => u.ConnectionID == Context.ConnectionId).SingleOrDefault(); //判断用户是否存在,否则添加集合 if (user == null) { user = new User("", Context.ConnectionId); users.Add(user); } return base.OnConnected(); } public override Task OnDisconnected(bool stopCalled) { var user = users.Where(p => p.ConnectionID == Context.ConnectionId).FirstOrDefault(); //判断用户是否存在,存在则删除 if (user != null) { //删除用户 users.Remove(user); } GetUsers();//获取所有用户的列表 return base.OnDisconnected(stopCalled); } //获取所有用户在线列表 private void GetUsers() { var list = users.Select(s => new { s.Name, s.ConnectionID }).ToList(); string jsonList = JsonConvert.SerializeObject(list); Clients.All.getUsers(jsonList); } } } 如果你是vs2015 的话添加的mvc项目 不进行身份验证的那种吧,必须得添加一个Startup 类。如果没有这个类请添加,不然的话项目运行不起来的,具体代码如下: using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(SignalROneToOneDemo.App_Start.SignalRQuickStart))] namespace SignalROneToOneDemo.App_Start { public class SignalRQuickStart { public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888 // 配置集线器 app.MapSignalR(); } } } ### 2.4、一对一聊天前台代码实现### @{ ViewBag.Title = "OneToOneChat"; } <h2>点对点(一对一)聊天实例代码</h2> <div> <div>用户名称:<label id="userName"></label>(<label id="conId"></label>)</div> <div style="width:25%;border:1px solid #ff0000"> <div>在线用户列表</div> <ul id="users"></ul> </div> <div id="userBox"> </div> </div> @section scripts { <script src="~/Scripts/jquery-3.3.1.min.js"></script> <script src="~/Scripts/jquery.signalR-2.4.1.min.js"></script> <script src="~/signalr/hubs"></script> <script type="text/javascript"> var clients = []; var chat; $(function () { chat = $.connection.chat; console.info(chat); //显示提示方法 chat.client.showMessage = function (message) { alert(message); } //注册显示信息的方法 chat.client.addMessage = function (message, connectionId) { //debugger if ($.inArray(connectionId, clients)==-1) { showWin(connectionId); } $("#messages" + connectionId).each(function () { $(this).append('<li>'+message+'</li>'); }) } //注册显示所有用户的方法 chat.client.getUsers = function (data) { if (data) { var json = $.parseJSON(data); console.info(json); $("#users").html(" "); for (var i = 0; i < json.length; i++) { var html = '<li>用户名:' + json[i].Name + '<input type="button" connectionId="' + json[i].ConnectionID + '" id="' + json[i].ConnectionID + '" value="聊天" onclick="userChat(this)" />' ; $("#users").append(html); } } } //注册显示推出聊天提示的方法 chat.client.exitUser = function (data) { alert(data); } //注册显示个人信息的方法 chat.client.showId = function (data) { $("#conId").html(data); clients.push(data); } //获取用户名称 $('#userName').html(prompt('请输入您的名称', '')); //连接成功后获取自己的信息 $.connection.hub.start().done(function () { chat.server.getName($('#userName').html()); }); }); //开始聊天 function userChat(obj) { var connectionId = $(obj).attr('connectionId'); showWin(connectionId); } function showWin(connectionId) { clients.push(connectionId); var html = '<div style="float:left;margin-top:5px;margin-right: 5px;margin-bottom: 5px;border:1px solid #ff0000" id="' + connectionId + '" connectionId="' + connectionId + '">' + connectionId + '"的房间聊天记录如下:<button onclick="exitChat(this)">退出</button><ul id="messages' + connectionId + '"></ul><input type="text" /> <button onclick="sendMessage(this)">发送</button></div>'; $("#userBox").append(html); } function exitChat(btnObj) { $(btnObj).parent().remove(); chat.server.exitChat(connectionId); } //发送消息 function sendMessage(data) { var message = $(data).prev().val(); var userObj = $(data).parent(); var username = $("#userName").html(); message = username + ":" + message; console.info($(userObj).attr("connectionId")); var targetConnectionId = $(userObj).attr("connectionId"); chat.server.sendMessage(targetConnectionId, message); $(data).prev().val(""); } </script> } ## 3、效果展示 ## ![一对一聊天效果展示](http://doc.rdiframework.net/blog/article/20190822111546241.png-pw) 到此,一个SignalR一对一(点对点)聊天例子就完成了,下面我们简单的对代码作下分析: Clients.Client(connectionId).addMessage():作用客户端注册addMessage方法,向指定连接Id的客户端发送消息。由于一对一聊天发送的消息也应该回发给自己,所以回发给自己连接的Id可以通过Context.ConnectionId来获取。当然也也可以使用Client.Caller()代替Client.Client(Context.ConnectionId)方法直接发送。 Client.Clients(IList<string> connectionIds):同时向多个ConnectionId发送消息,类似于QQ上@好友的功能。 通过浏览器F12我们可以看到SignalR给我们生成的方法: ![F12Hubs代码效果](http://doc.rdiframework.net/blog/article/20190822111606097.png-pw) 可以看到我们服务端开发的两个方法,需要特别说明的是服务器端的方法名在客户端调用都约定第一个字母为小写,当然我们也可以通过方法名上加特性HubMethodName进行标识处理。 ## 4、代码下载 ## 实例源码可以移步github下载,地址:[https://github.com/yonghu86/SignalRTestProj](https://github.com/yonghu86/SignalRTestProj) ## 5、参考文章 ## - [RDIFramework.NET敏捷开发框架通过SignalR技术整合即时通讯(IM)](http://www.guosisoft.com/article/detail/229) - [史上最全面的SignalR系列教程-1、认识SignalR](http://www.guosisoft.com/article/detail/225) - [史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式](http://www.guosisoft.com/article/detail/226) - [史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式](http://www.guosisoft.com/article/detail/227) - [史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例](http://www.guosisoft.com/article/detail/228) - [史上最全面的SignalR系列教程-目录汇总](http://www.guosisoft.com/article/detail/230) - [Real-time ASP.NET with SignalR](https://dotnet.microsoft.com/apps/aspnet/signalr) - [微信公众号开发系列-玩转微信开发-目录汇总](http://www.guosisoft.com/article/detail/216) - [RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录](http://www.guosisoft.com/article/detail/190) - [RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍](http://www.guosisoft.com/article/detail/169) - [RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用](http://www.guosisoft.com/article/detail/189) - [RDIFramework.NET代码生成器全新V3.5版本发布-重大升级](http://www.guosisoft.com/article/detail/199) ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 RDIFramework.NET官方网站:http://www.rdiframework.net/ RDIFramework.NET官方博客:http://blog.rdiframework.net/ 同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。 扫描二维码立即关注 ![微信号:guosisoft](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NET
消息交互
挨踢业界
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例
下一篇
史上最全面的SignalR系列教程-6、SignalR 实现聊天室
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台
RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录
[推荐]ORACLE SQL:经典查询练手(不懂装懂,永世饭桶!)
团队项目开发“编码规范”之九:代码分析
[推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
史上最全面的SignalR系列教程-1、认识SignalR
Visual Studio 2015官方汇总包括下载和视频
RDIFramework.NET开发实例之产品管理(WebForm版)
.NET分离exe和dll在不同的目录让你的程序更整洁
微信公众号开发C#系列-12、微信前端开发利器:WeUI
ORACLE常见问题一千问[301至400](不怕学不成、就怕心不诚!)
盘点WordPress站点维护与加速必备插件及技巧
微信公众号开发C#系列-11、生成带参数二维码应用场景
前端设计,确定按钮正慢慢消失
RDIFramework.NET V3.2-> Web版本新增新的用户权限设置界面效率更高、更规范
RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
.NET编译项目时出现《此实现不是 Windows 平台 FIPS 验证的加密算法的一部分》处理方法
JSON风格指南-真经
RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
ORACLE常见问题一千问[801至900](不怕学不成、就怕心不诚!)
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127