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

本博客通过SignalR技术实现了一个简单的在线聊天应用,包括用户上线、下线、修改昵称、发送消息等功能,并展示了如何在前后端进行交互以实现实时通信。

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

标签(空格分隔): SignalR


前言

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

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

类的定义

用户信息类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);
}
效果图

74311666jw1ewsffg621bj211y0g7abw.jpg

结束语

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

源码下载

本文发布至作业部落

参考文献

SignalR Programming in Microsoft ASP.NET pdf 下载

转载于:https://www.cnblogs.com/Jack-Blog/p/4858555.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值