mvc中signalr实现一对一的聊天

小编 2026-07-02 阅读:588 评论:0
Asp.net MVC中实现即时通讯聊天的功能。前几天刚写了一片基础入门的教程,今天就来实现一下...

Asp.net MVC中实现即时通讯聊天的功能。前几天刚写了一片基础入门的教程,今天就来实现一下使用signaIr实现一对一的聊天的功能,对于这种场景也是即时通讯最基本功能。好吧废话不多说。先来看一下最终实现的效果图:

mvc中signalr实现一对一的聊天

首先我们先搭建好环境,如果不熟悉,看下前面写的一片文章 MVC中使用signalR入门教程

接着:我们就开始写UserHub.cs 集线器类

主要的步骤就是要:

1. 重写OnConnected连接方法和OnDisconnected断开方法

2.服务器端方法 SendMessage 发送消息 ,GetName获取用户名

3.客户端响应的提示返回信息方法,比如Clients.Client(Context.ConnectionId).addMessage(message) .等等

using System;using System.Collections.Generic;using System.Linq;using System.Web;using Microsoft.AspNet.SignalR;using System.ComponentModel.DataAnnotations;using System.Threading.Tasks;using Newtonsoft.Json;using Microsoft.AspNet.SignalR.Hubs;namespace SignaIrOneONoneDemo{    [HubName("UserHub")]    public class UserHub : Hub    {        public static List<User> users = new List<User>();        //发送消息        public void  SendMessage(string  connectionId ,string   message)        {            Clients.All.hello();            var user = users.Where(s => s.ConnectionID == connectionId).FirstOrDefault();            if (user != null)            {                Clients.Client(connectionId).addMessage(message + "" + DateTime.Now, Context.ConnectionId);                //给自己发送,把用户的ID传给自己                Clients.Client(Context.ConnectionId).addMessage(message + "" + DateTime.Now, connectionId);            }            else            {                Clients.Client(Context.ConnectionId).showMessage("该用户已离线");            }        }        [HubMethodName("exitChat")]        public void GetName(string name)        {            //查询用户            var user = users.SingleOrDefault(u => u.ConnectionID == Context.ConnectionId);            if (user != null)            {                user.Name = name;                Clients.Client(Context.ConnectionId).showId(Context.ConnectionId);            }            GetUsers();        }        /// <summary>        /// 重写连接事件        /// </summary>        /// <returns></returns>        public override Task OnConnected()        {            //查询用户            var user = users.Where(w => w.ConnectionID == Context.ConnectionId).SingleOrDefault();            //判断用户是否存在,否则添加集合            if (user == null)            {                user = new User("", Context.ConnectionId);                users.Add(user);            }            return base.OnConnected();        }        public override Task OnDisconnected(bool stopCalled)        {            var user = users.Where(p => p.ConnectionID == Context.ConnectionId).FirstOrDefault();            //判断用户是否存在,存在则删除            if (user != null)            {                //删除用户                users.Remove(user);            }            GetUsers();//获取所有用户的列表            return base.OnDisconnected(stopCalled);        }        //获取所有用户在线列表        private void GetUsers()        {            var list = users.Select(s => new { s.Name, s.ConnectionID }).ToList();            string jsonList = JsonConvert.SerializeObject(list);            Clients.All.getUsers(jsonList);        }    }    public class User    {        [Key]        public string ConnectionID { get; set; }        public string Name { get; set; }        public User(string name, string connectionId)        {            this.Name = name;            this.ConnectionID = connectionId;        }    }}
然后我们来看一下前端页面是怎么写的


@{    ViewBag.Title = "UserChat";    Layout = null;}<h2>UserChat</h2><script src="~/Scripts/jquery-1.10.2.js"></script><script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script><script src="~/signalr/hubs"></script><script type="text/javascript">    var clients = [];    var chat;    $(function () {                chat = $.connection.UserHub;        console.info(chat);        //显示提示方法        chat.client.showMessage = function (message) {            alert(message);        }        //注册显示信息的方法        chat.client.addMessage = function (message, connectionId) {            debugger            if ($.inArray(connectionId, clients)==-1) {                showWin(connectionId);            }            $("#" + connectionId).find("ul").each(function () {                $(this).append('<li>'+message+'</li>');            })        }        //注册显示所有用户的方法        chat.client.getUsers = function (data) {                        if (data) {                var json = $.parseJSON(data);                                console.info(json);                $("#users").html(" ");                for (var i = 0; i < json.length; i++) {                    var html = '<li>用户名:' + json[i].Name + '<button connectionId="' + json[i].ConnectionID + '" onclick="userChat(this)">聊天</button>';                    $("#users").append(html);                }            }        }        //注册显示推出聊天提示的方法        chat.client.exitUser = function (data)        {            alert(data);        }        //注册显示个人信息的方法        chat.client.showId = function (data)        {            $("#conId").html(data);            clients.push(data);        }        //获取用户名称        $('#userName').html(prompt('请输入您的名称', ''));        //连接成功后获取自己的信息        $.connection.hub.start().done(function () {            chat.server.getName($('#userName').html());        });    });    //开始聊天    function userChat(obj)    {        var connectionId = $(obj).attr('connectionId');        showWin(connectionId);    }    function  showWin(connectionId)    {        //var connectionId = $(obj).attr('connectionId');        clients.push(connectionId);        var html = '<div style="float:left;margin-left:30px;border:double" id="' + connectionId + '" connectionId="' + connectionId + '">' + connectionId + '"的房间聊天记录如下:<button onclick="exitChat(this)">退出</button><ul></ul><input type="text" /> <button onclick="sendMessage(this)">发送</button></div>';        $("#userBox").append(html);    }    function exitChat(btnObj)    {        debugger      //  var connectionId = $(btnObj).parent().attr("connectionId");        $(btnObj).parent().remove();        //chat.server.exitChat(connectionId);    }    //发送消息    function sendMessage(data)    {        var message = $(data).prev().val();        var  userObj = $(data).parent();        var username = $("#userName").html();        message = username + ":" + message;        console.info($(userObj).attr("connectionId"));        var targetConnectionId = $(userObj).attr("connectionId");        chat.server.sendMessage(targetConnectionId, message);        $(data).prev().val("");    }</script><div>    <div>名称:<p id="userName"></p></div>    <div>ConnectionID:<p id="conId"></p></div>        <div style="width:25%;border:1px solid #ff0000">        <div>在线用户列表</div>        <ul id="users"></ul>    </div>    <div id="userBox">    </div></div>

一个signalr一对一聊天例子就完成了,我们来简单的分析一下吧:

Clients.Client(connectionId).addMessage() 此方法的作用就是客户端注册addMessage方法,向指定连接Id的客户端发送消息。一对一的聊天发送的消息也必须回发给自己,所以连接的Id可以通过Context.ConnectionId来获取。当然不用Client.Client(Context.ConnectionId) ,也可以使用Client.Caller()方法直接发送

Client.Clients(IList<string> connectionIds) 这个方法的意思就是想一组string 的几个ConnectionId发送消息。类似于QQ上@好友的那种功能。

在谷歌浏览器中我们可以看到这些方法

mvc中signalr实现一对一的聊天

可以很清楚的看到这个三个服务器端的方法,服务器端的方法名在客户端调用的时候都约定成了第一个字母小写了,但是可以通过方法上的特性HubMethodName进行标识。

这个集线器的UserHub也默认是第一个字母小写的,所以在前端写的时候要注意。源码下载地址:

作者:张林

标题:mvc中signalr实现一对一的聊天:http://blog.csdn.net/kebi007/article/details/53440242

转载随意注明出处
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表