mvc中signalr实现一对一的聊天

简介: Asp.net MVC中实现即时通讯聊天的功能。前几天刚写了一片基础入门的教程,今天就来实现一下使用signaIr实现一对一的聊天的功能,对于这种场景也是即时通讯最基本功能。好吧废话不多说。先来看一下最终实现的效果图:首先我们先搭建好环境,如果不熟悉,看下前面写的一片文章 MVC中使用signalR入门教程接着:我们就开始写UserHub.

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


首先我们先搭建好环境,如果不熟悉,看下前面写的一片文章 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上@好友的那种功能。

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


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

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

作者:张林

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

转载随意注明出处
目录
相关文章
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
58 0
|
开发框架 JavaScript 前端开发
SignalR 2.x入门(二):SignalR在MVC5中的使用
SignalR 2.x入门(二):SignalR在MVC5中的使用
156 0
SignalR 2.x入门(二):SignalR在MVC5中的使用
|
JSON JavaScript 前端开发
MVC中使用signalR入门教程
一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了&quot;星期一综合征&quot;,每个星期一很没有状态。全身都有点酸痛,这个可能一个星期只有周末才打一次球有关吧。好吧还是说说正经的,厂里的牛哥昨天分配给我一个任务,大概的一个意思就是“用这个signalR发送一条消息给客户端,客户端进行反馈响应”。
2543 0
|
前端开发 JavaScript Go
SignalR + MVC5 简单示例
原文:SignalR + MVC5 简单示例 本文和前一篇文章很类似,只不过是把 SignalR 应用在了 MVC 中   新建项目,选择 MVC 模板     安装 SignalR Install-Package Microsoft.
1140 0
|
JavaScript
AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景   OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户。 技术选择   最开始发现的是firebase,于是很兴奋的开始倒腾起来。
1875 0
|
JavaScript 前端开发 .NET
在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架。它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息。
1221 0
|
JavaScript 前端开发 .NET
在 Asp.NET MVC 中使用 SignalR 实现推送功能
原文http://www.cnblogs.com/kesalin/archive/2012/11/09/signalr_push.html 在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://www.cnblogs.com/kesalin/ ) CC许可,转载请注明出处   一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架。
1571 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
47 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
191 0