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

一步一步学习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进行实时通信_8_案例2

    原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...

  2. 一步一步学习SignalR进行实时通信_1_简单介绍

    一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...

  3. 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序

    原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...

  4. 一步一步学习SignalR进行实时通信_7_非代理

    原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...

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

    原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...

  6. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...

  7. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域

    原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...

  8. 一步一步学习SignalR进行实时通信_2_Persistent Connections

    原文:一步一步学习SignalR进行实时通信_2_Persistent Connections 一步一步学习SignalR进行实时通信\_2_Persistent Connections Signal ...

  9. 12.Linux软件安装 (一步一步学习大数据系列之 Linux)

    1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...

随机推荐

  1. PHP多种序列化/反序列化的方法 (转载)

    1. serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php $a = array('a' => 'Apple' ,'b' => ...

  2. centos出现磁盘坏掉,怎么修复和检测。

    当dmesg的时候,出现下面的信息说明磁盘有问题 Info fld=0x139066d0 end_request: I/O error, dev sda, sector 328230608 Buffe ...

  3. Python之路第八天,基础(9)-面向对象(下)

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  4. groovy 弹出菜单

    import groovy.swing.* import javax.swing.* import java.awt.* def swing = new SwingBuilder() swing.fr ...

  5. XML的DTD约束

    DTD约束:DTD的声明和引用 1.内部DTD文档 <!DOCTYPE 根元素 [定义内容]> 2.外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路 ...

  6. SAR数据下载网站

    1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.144.2153&rep=rep1&type=pdf[2] ht ...

  7. QNDTU外壳及开发板

        昨天从淘宝上淘来了个DTU外壳,翻出来之前的STM32开发板和GPRS模块开发板,今天准备复习一下开发板,把裸板跑起来.     晒一下装备:     两块开发板:           51n ...

  8. Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...

  9. html5 notifications通知

    http://www.html5rocks.com/en/tutorials/notifications/quick/?redirect_from_locale=zh http://www.paulu ...

  10. 跨域(cross-domain)访问 cookie (读取和设置)

    Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去.坦白说,目前 sohu passport 在这一点实现的很烂(不过俺的工 ...