一步一步学习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进行实时通信_6_案例的更多相关文章
- 一步一步学习SignalR进行实时通信_8_案例2
原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序
原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...
- 一步一步学习SignalR进行实时通信_7_非代理
原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...
- 一步一步学习SignalR进行实时通信_5_Hub
原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...
- 一步一步学习SignalR进行实时通信_4_Hub
原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...
- 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...
- 一步一步学习SignalR进行实时通信_2_Persistent Connections
原文:一步一步学习SignalR进行实时通信_2_Persistent Connections 一步一步学习SignalR进行实时通信\_2_Persistent Connections Signal ...
- 12.Linux软件安装 (一步一步学习大数据系列之 Linux)
1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...
随机推荐
- ORACLE触发器和new、old特殊变量
:new --为一个引用最新的列值;:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而inse ...
- php isset — 检测变量是否设置 foreach循环运用
例子 $a = 336 ; $b = 33 ; function large($x,$y){ if((!isset($x))||(!isset($y))){ // echo "this fu ...
- Entity Framewor中的 Migration
http://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx = Code bas ...
- 创建一个Hello World模块
这篇文章描述了怎样为Orchard建立一个非常小的模块,它只显示一个"Hello World"页面. 另一个模块[Module]的简单例子,你可以从这找到:Quick Start ...
- 好久没来了,重出江湖,共享个python34+pyqt+pyserial串口工具源码
真的是好久没来了,写博客对我来说还真是难坚持下来,热度一过就忘了,就算什么时候想起来也懒得去敲一个字,这次真不知道能坚持多久,随心吧,想写写,不想写也不勉强自己. 最近由于工作调试需要自己写了一个带图 ...
- HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)
观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...
- JavaEE Tutorials (25) - 使用Java EE拦截器
25.1拦截器概述380 25.1.1拦截器类381 25.1.2拦截器生命周期381 25.1.3拦截器和CDI38125.2使用拦截器381 25.2.1拦截方法调用382 25.2.2拦截生命周 ...
- Google map v3 using simple tool file google.map.util.js v 1.2
更新添加日志:在1.1的基础上添加marker的文字显示.测距工具. /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 20 ...
- OpenSuSE查看指定软件包是否安装(OpenSuSE使用RPM作为默认的软件包维护管理工具)
suse 是 zypper se xxxxx 是搜索软件包 (查看已经安装的 软件包是否已经安装)
- linux服务器WEB环境一键安装包lanmp教程之五
在我们安装了linux服务器WEB环境一键安装包lanmp后,可能会有不少疑问还有就是使用过程中出现的问题,下面为大家总结几点比较常见的,如若还有其他疑问,可到wdlinux论坛寻找相关教程. 1.增 ...