一步一步学习SignalR进行实时通信_6_案例
- 一步一步学习SignalR进行实时通信_6_案例1
- 前言
- 类的定义
- 各块功能
- 后台
- 上线
- 下线
- 修改昵称
- 发送消息给所有人
- 前台
- 用户上线消息
- 昵称改变消息
- 用户下线消息
- 更新个人信息
- 用户上线提醒
- 发送消息
- 效果图
- 后台
- 结束语
- 参考文献
前言
由于这段时间在找房子,所以耽误了一段时间。前几讲把一些基础的东西稍微介绍了下,这一讲就简单介绍一个小例子,大致功能是实现在线聊天,并显示在线用户、用户上下线实时提醒。这个例子并不复杂只是把之前介绍联系起来。
在这里为了简单起见,暂时不涉及到数据库的操作。
类的定义
用户信息类UserInfo
public class UserInfo
{
/// <summary>
/// ConnectionId
/// </summary>
public string ConnectionId { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 上线时间
/// </summary>
public DateTime ConnectedAt { get; set; }
/// <summary>
/// 在线标志
/// </summary>
public bool IsOnline { get; set; }
}
各块功能
后台
上线
public override Task OnConnected()
{
Interlocked.Increment(ref _usersCount);
var user = new UserInfo()
{
ConnectionId = Context.ConnectionId,
IsOnline = true,
Name = "user" + _usersCount,
ConnectedAt = DateTime.Now
};
_users[Context.ConnectionId] = user;
var notifyAll = (Task)Clients.All.NewUserNotification(user);
var updateMessage = (Task)Clients.Caller.UpdateMessage(user.Name, _users.Values.ToArray());
var sendToAll = (Task)Clients.Others.welcome(_users.Values.ToArray());
return notifyAll.ContinueWith(_ => updateMessage).ContinueWith(_ => sendToAll);
}
下线
public override Task OnDisconnected()
{
UserInfo user;
if (_users.TryRemove(Context.ConnectionId, out user))
{
return Clients.All.UserDisconnectedNotification(user);
}
return base.OnDisconnected();
}
修改昵称
public Task ChangeNickname(string newName)
{
UserInfo user;
if (_users.TryGetValue(Context.ConnectionId, out user))
{
var oldName = user.Name;
user.Name = newName;
return Clients.All.NicknameChangedNotification(user, oldName);
}
return null;
}
发送消息给所有人
public Task Send(string message)
{
UserInfo user;
if (_users.TryGetValue(Context.ConnectionId, out user))
{
var msgToSend = string.Format("[{0}]: {1}", user.Name, message);
return Clients.All.Message(msgToSend);
}
return null;
}
前台
用户上线消息
function newUserNotification(user) {
if (getUserElement(user.ConnectionId).length == 0) {
$("#users").append($(getUserListItem(user)));
}
systemMessage("欢迎 " + user.Name + " 用户进入聊天室!");
}
昵称改变消息
function nicknameChangedNotification(user, oldName) {
var userElement = getUserElement(user.ConnectionId);
if (userElement.length > 0) {
userElement.replaceWith($(getUserListItem(user)));
systemMessage(oldName + " 改名为 " + user.Name + ".");
}
if (user.Id === $.connection.hub.id) {
$("#name").text(user.Name);
}
用户下线消息
function userDisconnectedNotification(user) {
var userElement = getUserElement(user.ConnectionId);
if (userElement.length > 0) {
systemMessage(user.Name + " 离开聊天室.");
userElement.remove();
}
}
更新个人信息
function updateMessage(assignedNickname, userList) {
var result = "";
for (var i = 0; i < userList.length; i++) {
var user = userList[i];
result += getUserListItem(user);
}
$("#users").empty();
$("#users").append(result);
$("#username").text(assignedNickname);
$("#user-info").show();
}
用户上线提醒
function welcome(userList) {
var result = "";
for (var i = 0; i < userList.length; i++) {
var user = userList[i];
result += getUserListItem(user);
}
$("#users").empty();
$("#users").append(result);
}
发送消息
function message(message) {
var $panel = $("#chatpanel");
$panel.append("<li class='list-group-item'>" + message + "</li>");
$panel.scrollTop($panel[0].scrollHeight);
}
效果图
结束语
功能较为简单,本来还加了其他的功能,但是由于最近太忙了,打好了一半然后又全部删掉了,后面有时间再慢慢加上去。
源码下载
本文发布至作业部落
参考文献
SignalR Programming in Microsoft ASP.NET pdf 下载
一步一步学习SignalR进行实时通信_6_案例相关推荐
- 一步一步学习SignalR进行实时通信_5_Hub
目录 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 Hub封装好的常用方法 Hub常用方法解释 保持状态 前后台交互 结束语 参考文献 一步一步学习SignalR进行实时通 ...
- 【深度学习基础】一步一步讲解卷积神经网络
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送 本文转自:一步一步讲解卷积神经网络 卷积神经网络(Convoluti ...
- 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...
通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...
- 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...
- 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)
今天学习了服务器端激活和客户端激活的区别!可还是出现了一点点的差错,经过对比得到正确的调用方法,整理如下: 1.服务器端激活,分为两种方式Singleton和SingleCall方式 Server端A ...
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
本来这第二篇打算讲解"开发第一个基于XFire的webservice"的内容来着.但是想想.开发实例只是局限于了会用的层面上.如果想真正的理解webservice还是需要挖掘其原理 ...
- 一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!
目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者.本教程由 EntLib.com 团队编写.如有任何技术问题,欢迎留言. 电子版 – PDF ...
- GitChat · 大数据 | 一步一步学习大数据:Hadoop 生态系统与场景
目录(?)[-] Hadoop概要 Hadoop相关组件介绍 HDFS Yarn Hive HBase Spark Other Tools Hadoop集群硬件和拓扑规划 硬件配置 软件配置 Hado ...
- visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
工欲善其事,必先利其器: 器欲尽其用,必先得其法. 前面两章我们分别安装了Python3.8和在三种模式下运行了Python的print()函数程序.在开始我们正式学习Python基础语法时,我们先把 ...
最新文章
- python将sklearn的RocCurveDisplay结果与PrecisionRecallDisplay结果合成为一个图
- Transformer-LS霸榜ImageNet,输入长度提升三倍!极度压缩参数
- 【WPF学习笔记】[转]周银辉之WPF中的动画 晓风影天之wpf动画——new PropertyPath属性链...
- pythonutf-8是不是二进制_python学习笔记8-9(字符编码与二进制)
- win10+Linux双系统安装
- windows编译python扩展Unable to find vcvarsall
- 2018厦门大学计算机技术分数线,厦门大学录取分数线2018 厦门大学录取分数最高的专业...
- C++17 关键新特性介绍及代码讲解 (6) — fold expression
- 蚂蚁金服与阿里云“双剑合璧”,加速释放金融科技时代新红利
- 主流大数据调度工具对比
- 用go来搭建一个简单的图片上传网站
- 微信小程序 苹果手机 https wx.request 不反应
- WikiText数据集_自然语言处理
- 四个方面比较CPU卡加密系统与M1加密系统
- nextcloud安装日历插件使用并设置导入导出和云端同步(安卓手机和ios手机)
- YOLOv7半自动标注
- uni-app/5+App开发淘客商城时如何拉起淘宝/京东/拼多多
- utf8 转 gbk/gb2312有些字乱码问题,例如 珺字
- mendeley中如何重复引用同一篇参考文献_免费文献管理器 Mendeley,其实比你想象的好用!...
- 关于视觉三维重建colmap 一期课程,我想说点什么
热门文章
- html自定义datajs,科技常识:HTML5的自定义属性data-*详细介绍和JS操作实例
- 两相四线步进电机C语言程序,求大神帮忙看单片机控制两相四线步进电机的程序!...
- python中findroot_python文件查找之find命令
- MATLAB中的三角函数单位问题
- JavaScript的使用
- JavaScript的toString()和valueOf()函数
- ubuntu root默认密码(初始密码)
- 解决Tomcat 7遇到StackOverflowError的异常
- Win7 64位系统 注册 ocx控件
- PHP服务器时间差8小时解决方案