首页 > 其他分享 >SignalRChat聊天处理类

SignalRChat聊天处理类

时间:2023-03-12 10:55:21浏览次数:41  
标签:userName string 处理 ConnectedUsers ConnectionId 聊天 message id SignalRChat

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using SignalRChat.Common;


namespace SignalRChat
{
    /// <summary>
    /// 聊天处理类
    /// </summary>
    public class ChatHub : Hub
    {
        #region 数据对象
        /// <summary>
        /// 连接用户
        /// </summary>
        static List<UserDetail> ConnectedUsers = new List<UserDetail>();
        /// <summary>
        /// 聊天消息内容
        /// </summary>
        static List<MessageDetail> CurrentMessage = new List<MessageDetail>();


        #endregion


        #region 方法体
        /// <summary>
        /// 用户连接
        /// </summary>
        /// <param name="userName">用户名称</param>
        public void Connect(string userName)
        {
            var id = Context.ConnectionId;


            if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)//将新登陆用户记录到缓存中
            {
                ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = userName });


                // 向登陆用户发送相关信息(当前用户、历史消息)
                Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage);


                // 除开当前登陆用户,向其他客户端用户发送信息(有新的用户登陆提示信息)
                Clients.AllExcept(id).onNewUserConnected(id, userName);


            }


        }
        /// <summary>
        /// 发送消息给所有用户
        /// </summary>
        /// <param name="userName">发送者用户名称</param>
        /// <param name="message">消息内容</param>
        public void SendMessageToAll(string userName, string message)
        {
            // 向缓存中加入此消息
            AddMessageinCache(userName, message);


            // 让消息界面上显示
            Clients.All.messageReceived(userName, message);
        }
        /// <summary>
        /// 给指定用户发送消息
        /// </summary>
        /// <param name="toUserId">接收者编号</param>
        /// <param name="message">消息内容</param>
        public void SendPrivateMessage(string toUserId, string message)
        {
            ///当前发送者连接编号
            string fromUserId = Context.ConnectionId;


            var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId) ;
            var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId);


            if (toUser != null && fromUser!=null)
            {
                //指定用户发送消息界面显示方法
                Clients.Client(toUserId).sendPrivateMessage(fromUserId, fromUser.UserName, message);


                // 发送者界面显示消息
                Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message); 
            }


        }
        /// <summary>
        /// 退出
        /// </summary>
        /// <param name="userID">用户连接编号</param>
        public void donExit(string userID)
        {
            var id = Context.ConnectionId;


            OnDisconnected();
            Clients.Caller.onConnected(id, userID, "");
            Clients.Client(id).donExit(id, userID);
        }




        /// <summary>
        /// 退出方法
        /// </summary>
        /// <returns></returns>
        public override System.Threading.Tasks.Task OnDisconnected()
        {
            var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            if (item != null)
            {
                ConnectedUsers.Remove(item);
                var id = Context.ConnectionId;
                Clients.All.onUserDisconnected(id, item.UserName);


            }


            return base.OnDisconnected();
        }


        /// <summary>
        /// 向缓存中加入一条消息(只记录最后100条消息)
        /// </summary>
        /// <param name="userName">发送者</param>
        /// <param name="message">消息内容</param>
        private void AddMessageinCache(string userName, string message)
        {
            CurrentMessage.Add(new MessageDetail { UserName = userName, Message = message });


            if (CurrentMessage.Count > 100)
                CurrentMessage.RemoveAt(0);
        }




        #endregion
    }


}

转载地址:http://www.gycehuags.com/study/672.html

源代码下载:http://www.gycehuags.com/upimg/file/20230312/2023031210430117117.rar

标签:userName,string,处理,ConnectedUsers,ConnectionId,聊天,message,id,SignalRChat
From: https://www.cnblogs.com/gycehuags/p/17207757.html

相关文章

  • VB6.0window消息处理方式
    AttributeVB_Name="Module1"OptionExplicitPublicConstWM_NCHITTEST=&H84'移动鼠标,按住或释放鼠标时产生此消息PublicConstHTCAPTION=2'不返回给系统Public......
  • Java基础四-异常处理/集合框架以及泛型
    异常的处理编写程序时,代码可能会重新啊运行错误或编译错误,为了处理问题可以使用异常机制异常包括错误类型,原因和位置异常的体系结构 如何进行异常处理java异常......
  • 宏任务&微处理
    事件循环JavaScript语言的一大特点就是单线程,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI渲染和网络处理等行为,防止主线程的不阻塞,EventLoop的方案应......
  • Zabbix监控Tomcat开启JMX时修改catalina.sh文件后tomcat服务起不来/配置catalian.sh不
    zabbix监控tomcat,开启JMX修改catalina.sh文件,tomcat服务起不来问题现象(配置Catalina.sh脚本,开启JMX不起效)问题一:配置完脚本,重启tomcattomcat服务启动失败查看tomcat的ca......
  • flink入门-流处理
    入门需要掌握:从入门demo理解、flink系统架构(看几个关键组件)、安装、使用flink的命令跑jar包+flink的webUI界面的监控、常见错误、调优一、入门demo:统计单词个数0、......
  • 图像处理之均值滤波3
    ​​​​1概述均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的平均值(所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。我们在......
  • sql处理重复的列,更好理清分组和分区
    一、分组统计、分区排名1、语法和含义:如果查询结果看得有疑惑,看第二部分-sql处理重复的列,更好理清分组和分区,有建表插入数据的sql语句分组统计:GROUPBY结合统计/......
  • Gin学习笔记--使用路由组分类处理请求
    在实际的项目开发中,均是模块化开发,同一模块化的功能接口,往往会有相同的接口前缀,比如说用户有不同的注册,登录等注册:http:..localhost:8080/user/register登录:http://loca......
  • 国外SEO舆情处理最佳黄金时间
    在国外市场,SEO(搜索引擎优化)的舆情处理是非常重要的,因为它可以帮助提高网站的排名和流量,并且建立品牌的声誉和信誉。然而,在什么时间进行舆情处理是一个值得探讨的问题。在本......
  • 编写聊天软件10
    要创建真正的WebSocket应用,首先,得有一个基于MVC的Web应用,也就是我们在前面用koa2和Nunjucks创建的Web,在此基础上,把WebSocket添加进来,才算完整。因此,本节的目标是基于WebSock......