Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
.NET(Core)
正文
原创
2019-08-22
浏览 (
12446
)
史上最全面的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前端
数据库
挨踢业界
随机文章
微信公众号开发C#系列-3、搭建微信本地调试环境-借助花生壳实现内网穿透
书写高质量JavaScript代码的要义(The Essentials of Writing High Quality JavaScript)翻译
ORACLE常见问题一千问[1至100](不怕学不成、就怕心不诚!)
一文带你理清同源和跨域
团队项目开发"编码规范"之五:命名规范
.NET快速信息化系统开发框架 V3.2->WinForm版本新增新的用户权限设置界面效率更高、更规范
ORACLE常见问题一千问[801至900](不怕学不成、就怕心不诚!)
RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
RDIFramework.NET敏捷开发框架Web新增邮件中心实现便捷式的邮件收发
微信公众号开发C#系列-10、长链接转短链接
RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
RDIFramework.NET V3.3 Web版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
RDIFramework.NETV2.9版本 Web新增至14套皮肤风格+三套界面组合(共42套皮肤组合)
[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
团队项目开发"编码规范"之七:控件命名规则
MySQL 使用规范
RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍-3.3版本
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127