您的位置:首页 > 其它

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

2015-10-07 13:03 204 查看

一步一步学习SignalR进行实时通信\_6_案例1一步一步学习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; }

}

[/code]

各块功能

后台

上线

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);

}

[/code]

下线

public override Task OnDisconnected()

{

UserInfo user;

if (_users.TryRemove(Context.ConnectionId, out user))

{

return Clients.All.UserDisconnectedNotification(user);

}

return base.OnDisconnected();

}

[/code]

修改昵称

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;

}

[/code]

发送消息给所有人

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;

}

[/code]

前台

用户上线消息

function newUserNotification(user) {

if (getUserElement(user.ConnectionId).length == 0) {

$("#users").append($(getUserListItem(user)));

}

systemMessage("欢迎 " + user.Name + " 用户进入聊天室!");

}

[/code]

昵称改变消息

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);

}

[/code]

用户下线消息

function userDisconnectedNotification(user) {

var userElement = getUserElement(user.ConnectionId);

if (userElement.length > 0) {

systemMessage(user.Name + " 离开聊天室.");

userElement.remove();

}

}

[/code]

更新个人信息

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();

}

[/code]

用户上线提醒

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);

}

[/code]

发送消息

function message(message) {

var $panel = $("#chatpanel");

$panel.append("<li class='list-group-item'>" + message + "</li>");

$panel.scrollTop($panel[0].scrollHeight);

}

[/code]

效果图



结束语

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

源码下载

本文发布至作业部落

参考文献

SignalR Programming in Microsoft ASP.NET pdf 下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: