原文:一步一步学习SignalR进行实时通信_6_案例一步一步学习SignalR进行实时通信\_6_案例1


  • 一步一步学习SignalR进行实时通信_6_案例1

    • 前言
    • 类的定义
    • 各块功能
      • 后台

        • 上线
        • 下线
        • 修改昵称
        • 发送消息给所有人
      • 前台
        • 用户上线消息
        • 昵称改变消息
        • 用户下线消息
        • 更新个人信息
        • 用户上线提醒
        • 发送消息
        • 效果图
    • 结束语
    • 参考文献

前言

由于这段时间在找房子,所以耽误了一段时间。前几讲把一些基础的东西稍微介绍了下,这一讲就简单介绍一个小例子,大致功能是实现在线聊天,并显示在线用户、用户上下线实时提醒。这个例子并不复杂只是把之前介绍联系起来。

在这里为了简单起见,暂时不涉及到数据库的操作。

类的定义

用户信息类UserInfo

  1. public class UserInfo
  2. {
  3. /// <summary>
  4. /// ConnectionId
  5. /// </summary>
  6. public string ConnectionId { get; set; }
  7. /// <summary>
  8. /// 姓名
  9. /// </summary>
  10. public string Name { get; set; }
  11. /// <summary>
  12. /// 上线时间
  13. /// </summary>
  14. public DateTime ConnectedAt { get; set; }
  15. /// <summary>
  16. /// 在线标志
  17. /// </summary>
  18. public bool IsOnline { get; set; }
  19. }

各块功能

后台

上线

  1. public override Task OnConnected()
  2. {
  3. Interlocked.Increment(ref _usersCount);
  4. var user = new UserInfo()
  5. {
  6. ConnectionId = Context.ConnectionId,
  7. IsOnline = true,
  8. Name = "user" + _usersCount,
  9. ConnectedAt = DateTime.Now
  10. };
  11. _users[Context.ConnectionId] = user;
  12. var notifyAll = (Task)Clients.All.NewUserNotification(user);
  13. var updateMessage = (Task)Clients.Caller.UpdateMessage(user.Name, _users.Values.ToArray());
  14. var sendToAll = (Task)Clients.Others.welcome(_users.Values.ToArray());
  15. return notifyAll.ContinueWith(_ => updateMessage).ContinueWith(_ => sendToAll);
  16. }

下线

  1. public override Task OnDisconnected()
  2. {
  3. UserInfo user;
  4. if (_users.TryRemove(Context.ConnectionId, out user))
  5. {
  6. return Clients.All.UserDisconnectedNotification(user);
  7. }
  8. return base.OnDisconnected();
  9. }

修改昵称

  1. public Task ChangeNickname(string newName)
  2. {
  3. UserInfo user;
  4. if (_users.TryGetValue(Context.ConnectionId, out user))
  5. {
  6. var oldName = user.Name;
  7. user.Name = newName;
  8. return Clients.All.NicknameChangedNotification(user, oldName);
  9. }
  10. return null;
  11. }

发送消息给所有人

  1. public Task Send(string message)
  2. {
  3. UserInfo user;
  4. if (_users.TryGetValue(Context.ConnectionId, out user))
  5. {
  6. var msgToSend = string.Format("[{0}]: {1}", user.Name, message);
  7. return Clients.All.Message(msgToSend);
  8. }
  9. return null;
  10. }

前台

用户上线消息

  1. function newUserNotification(user) {
  2. if (getUserElement(user.ConnectionId).length == 0) {
  3. $("#users").append($(getUserListItem(user)));
  4. }
  5. systemMessage("欢迎 " + user.Name + " 用户进入聊天室!");
  6. }

昵称改变消息

  1. function nicknameChangedNotification(user, oldName) {
  2. var userElement = getUserElement(user.ConnectionId);
  3. if (userElement.length > 0) {
  4. userElement.replaceWith($(getUserListItem(user)));
  5. systemMessage(oldName + " 改名为 " + user.Name + ".");
  6. }
  7. if (user.Id === $.connection.hub.id) {
  8. $("#name").text(user.Name);
  9. }

用户下线消息

  1. function userDisconnectedNotification(user) {
  2. var userElement = getUserElement(user.ConnectionId);
  3. if (userElement.length > 0) {
  4. systemMessage(user.Name + " 离开聊天室.");
  5. userElement.remove();
  6. }
  7. }

更新个人信息

  1. function updateMessage(assignedNickname, userList) {
  2. var result = "";
  3. for (var i = 0; i < userList.length; i++) {
  4. var user = userList[i];
  5. result += getUserListItem(user);
  6. }
  7. $("#users").empty();
  8. $("#users").append(result);
  9. $("#username").text(assignedNickname);
  10. $("#user-info").show();
  11. }

用户上线提醒

  1. function welcome(userList) {
  2. var result = "";
  3. for (var i = 0; i < userList.length; i++) {
  4. var user = userList[i];
  5. result += getUserListItem(user);
  6. }
  7. $("#users").empty();
  8. $("#users").append(result);
  9. }

发送消息

  1. function message(message) {
  2. var $panel = $("#chatpanel");
  3. $panel.append("<li class='list-group-item'>" + message + "</li>");
  4. $panel.scrollTop($panel[0].scrollHeight);
  5. }

效果图

结束语

功能较为简单,本来还加了其他的功能,但是由于最近太忙了,打好了一半然后又全部删掉了,后面有时间再慢慢加上去。

源码下载

本文发布至作业部落

参考文献

SignalR Programming in Microsoft ASP.NET pdf 下载

一步一步学习SignalR进行实时通信_6_案例相关推荐

  1. 一步一步学习SignalR进行实时通信_5_Hub

    目录 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 Hub封装好的常用方法 Hub常用方法解释 保持状态 前后台交互 结束语 参考文献 一步一步学习SignalR进行实时通 ...

  2. 【深度学习基础】一步一步讲解卷积神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送 本文转自:一步一步讲解卷积神经网络 卷积神经网络(Convoluti ...

  3. 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...

    通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本   版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...

  4. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!

    一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...

  5. 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)

    今天学习了服务器端激活和客户端激活的区别!可还是出现了一点点的差错,经过对比得到正确的调用方法,整理如下: 1.服务器端激活,分为两种方式Singleton和SingleCall方式 Server端A ...

  6. Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理

    本来这第二篇打算讲解"开发第一个基于XFire的webservice"的内容来着.但是想想.开发实例只是局限于了会用的层面上.如果想真正的理解webservice还是需要挖掘其原理 ...

  7. 一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

    目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者.本教程由 EntLib.com 团队编写.如有任何技术问题,欢迎留言. 电子版 – PDF ...

  8. GitChat · 大数据 | 一步一步学习大数据:Hadoop 生态系统与场景

    目录(?)[-] Hadoop概要 Hadoop相关组件介绍 HDFS Yarn Hive HBase Spark Other Tools Hadoop集群硬件和拓扑规划 硬件配置 软件配置 Hado ...

  9. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code

    工欲善其事,必先利其器: 器欲尽其用,必先得其法. 前面两章我们分别安装了Python3.8和在三种模式下运行了Python的print()函数程序.在开始我们正式学习Python基础语法时,我们先把 ...

最新文章

  1. python将sklearn的RocCurveDisplay结果与PrecisionRecallDisplay结果合成为一个图
  2. Transformer-LS霸榜ImageNet,输入长度提升三倍!极度压缩参数
  3. 【WPF学习笔记】[转]周银辉之WPF中的动画 晓风影天之wpf动画——new PropertyPath属性链...
  4. pythonutf-8是不是二进制_python学习笔记8-9(字符编码与二进制)
  5. win10+Linux双系统安装
  6. windows编译python扩展Unable to find vcvarsall
  7. 2018厦门大学计算机技术分数线,厦门大学录取分数线2018 厦门大学录取分数最高的专业...
  8. C++17 关键新特性介绍及代码讲解 (6) — fold expression
  9. 蚂蚁金服与阿里云“双剑合璧”,加速释放金融科技时代新红利
  10. 主流大数据调度工具对比
  11. 用go来搭建一个简单的图片上传网站
  12. 微信小程序 苹果手机 https wx.request 不反应
  13. WikiText数据集_自然语言处理
  14. 四个方面比较CPU卡加密系统与M1加密系统
  15. nextcloud安装日历插件使用并设置导入导出和云端同步(安卓手机和ios手机)
  16. YOLOv7半自动标注
  17. uni-app/5+App开发淘客商城时如何拉起淘宝/京东/拼多多
  18. utf8 转 gbk/gb2312有些字乱码问题,例如 珺字
  19. mendeley中如何重复引用同一篇参考文献_免费文献管理器 Mendeley,其实比你想象的好用!...
  20. 关于视觉三维重建colmap 一期课程,我想说点什么

热门文章

  1. html自定义datajs,科技常识:HTML5的自定义属性data-*详细介绍和JS操作实例
  2. 两相四线步进电机C语言程序,求大神帮忙看单片机控制两相四线步进电机的程序!...
  3. python中findroot_python文件查找之find命令
  4. MATLAB中的三角函数单位问题
  5. JavaScript的使用
  6. JavaScript的toString()和valueOf()函数
  7. ubuntu root默认密码(初始密码)
  8. 解决Tomcat 7遇到StackOverflowError的异常
  9. Win7 64位系统 注册 ocx控件
  10. PHP服务器时间差8小时解决方案