返回顶部
首页 > 资讯 > 精选 >Asp.net如何通过SignalR2进行实时聊天
  • 908
分享到

Asp.net如何通过SignalR2进行实时聊天

2023-06-30 16:06:52 908人浏览 独家记忆
摘要

本篇内容主要讲解“asp.net如何通过SignalR2进行实时聊天”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Asp.net如何通过SignalR2进行实时聊天”吧!一:什么是signalR

本篇内容主要讲解“asp.net如何通过SignalR2进行实时聊天”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Asp.net如何通过SignalR2进行实时聊天”吧!

    一:什么是signalR

    Asp.net SignalR是微软为实现实时通信的一个类库。

    一般情况下,signalR会使用javascript的长轮询(long polling)的方式来实现客户端和服务器通信,随着HTML5websockets出现,SignalR也支持WEBSockets通信。

    另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在linux环境下。

    SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将jsON转换成对象。

    客户端和服务端的具体交互情况如下图所示:

    Asp.net如何通过SignalR2进行实时聊天

    1、SignalR传输方式

    1、html5 传输

    这种传输方式当然是需要对HTML5兼容支持。如果客户端不支持HTML5 标准,那么你可以使用其他方式。

    • WebSocket: (前提是服务器和客户端都可以支持WebSocket )。WebSocket 是唯一的能够支持服务器和客户端建立真正持久的双向连接的传输方式,但是就是WebSocket要求的条件比较苛刻。 
      WebSocket真正能够支持只是在最新的IE 浏览器、Chrome、Firefox和一些其他的浏览器比如Opera 和 Safari。 

    • Server Sent Events (SSE)服务端发送事件 :就是我们常说的EventSource (除了IE的其他浏览器都支持支持服务器发送事件)。

    2、Comet 传输

    下面的传输方式都是建立在Comet Web应用模型上。这种传输方式会在浏览器或者其他客户端保持一个长连接的Http请求,服务器可以利用这个请求将数据推送到客户端,而不用等客户端单独去请求数据。

    • Forever Frame:(只有IE浏览器支持)Forever Frame 会创建一个隐藏的IFrame ,这个IFrame 会向服务器发起一个端点请求,但是这个请求不会结束。服务器会不停的发送脚本到客户端马上执行,提供一个从服务器端到客户端的单向实时连接。服务端到客户端和客户端到服务端分别是两个不同的连接,就像一个标准的HTTP请求,一旦有数据需要发送就会创建一个新的连接。

    • Ajax Long Polling长轮询:长轮询不会创建一个持久的连接,它是会保持一个客户端与服务器的连接,直到服务器做出应答就会立即关闭,然后创建一个新的连接。当连接重置的时候这会导致一些延迟。

    2、SignalR连接模式

    • Http Persisten Connection(持久连接)对象:用来解决长时间连接的功能。 
      还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection 内所提供的五个事件:OnConnected, OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。

    • Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。 
      SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

    下面的图展示了Hub和持久连接的关系,让你对底层的传输技术一目了然。

    Asp.net如何通过SignalR2进行实时聊天

    二、服务端

    原文参考:教程:通过 SignalR 2 进行实时聊天

    使用vs2012创建一个新的ASP.NET Web Application项目。

    Asp.net如何通过SignalR2进行实时聊天

    1、添加服务端Hub

    解决方案中添加SignalR Hub类选项,然后创建文件ChatHub.cs。此步骤将创建ChatHub.cs类文件并添加一组脚本文件和 SignalR 支持到项目的程序集引用。

    注意:可以使用NuGet命令 install-package Microsoft.AspNet.SignalR 来引用SignalR到项目中

    Asp.net如何通过SignalR2进行实时聊天

    然后在ChatHub类中输入下面这段代码。

    using Microsoft.AspNet.SignalR;namespace WebApplication2{    public class ChatHub : Hub    {        //定义可以被网页脚本访问的公共方法        public void Send(string name, string message) //在客户端可以使用hub.server.send()方法调用。        {            // 客户端通过调用broadcastMessage来获取服务端数据            Clients.All.broadcastMessage(name, message);//在客户端通过hub.client.broadcastMessage=function(){…}定义这个回调函数。        }    }}

    ChatHub类中,可以看到它继承自Microsoft.AspNet.SignalR.Hub类。从Hub类派生出类是构建SignalR应用程序的有用方式。在这个类(ChatHub)中定义的公共方法可以被网页内的脚本访问。

    在这段代码中(ChatHub类),客户端通过调用ChatHub.Send方法,并把名称和消息内容做为参数传递给ChatHub。而ChatHub则通过Clients.All.broadcastMessage方法把该消息广播给所有客户端。

    Send方法演示了几个Hub概念:

    • 在hub上声明一些公共方法,以便客户端可以调用它们。

    • 使用Microsoft.AspNet.SignalR.Hub。客户端动态属性用于与连接到此中心的所有客户端进行通信。

    • 调用客户机上的函数(如broadcastMessage函数)来更新客户机。

    2、添加OWIN 启动类

    Solution Explorer中,右击项目,然后添加一个名为StartupOWIN 启动类,然后输入下面这段代码。

    using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(WebApplication2.Startup))]namespace WebApplication2{    public class Startup    {        public void Configuration(IAppBuilder app)        {            app.MapSignalR();        }    }}

    三、客户端

    在项目中添加一个静态网页文件,并命名为index.html,然后右击该网页文件,并选择Set As Start Page,在Index.html中输入下面的代码,注意引用正确的文件名。

    <!DOCTYPE html><html><head>    <title>SignalR Simple Chat</title>    <style type="text/CSS">        .container {            background-color: #99CCFF;            border: thick solid #808080;            padding: 20px;            margin: 20px;        }    </style></head><body>    <div class="container">        <input type="text" id="message" />        <input type="button" id="sendmessage" value="Send" />        <input type="hidden" id="displayname" />        <ul id="discussion"></ul>    </div>    Reference the Jquery library.     <script src="Scripts/jquery-1.12.4.js"></script>    Reference the SignalR library.     <script src="Scripts/jquery.signalR-2.4.1.js"></script>    Reference the autogenerated SignalR hub script.     <script src="signalr/hubs"></script>    Add script to update the page and send messages.    <script type="text/javascript">        $(function () {            // 1、声明一个代理,用于引用服务端hub            var chat = $.connection.chatHub;            // 2、创建一个回调函数,让Hub调用它来广播消息。            chat.client.broadcastMessage = function (name, message) {                // Html编码形式显示名称和消息                var encodedName = $('').text(name).html();                var encodedMsg = $('').text(message).html();;                // 将消息添加到页面。                $('#discussion').append('' + encodedName                    + ':  ' + encodedMsg + '');            };            // 获取用户名            $('#displayname').val(prompt('Enter your name:', ''));            // 将初始焦点设置为消息输入框。            $('#message').focus();            // 3、开始连接和发送消息            $.connection.hub.start().done(function () {                $('#sendmessage').click(function () {                    // 在Hub上调用Send方法.                    chat.server.send($('#displayname').val(), $('#message').val());                    // 清除文本框并为下一个注释重置焦点。                    $('#message').val('').focus();                });            });        });    </script></body></html>

    客户端通过jquery.signalR.jssignalr/hubs来与服务器进行通信,首先它要声明一个代理来引用集线器。

    var chat = $.connection.chatHub

    请注意:在JavaScript中,对服务器类及其成员的引用必须是camelCase形式。本例中将C#服务端的ChatHub类在JavaScript中的引用为chatHub。

    然后它要再定义一个回调函数,这个回调函数主要是为了让服务器进行调用,从而将数据推送到客户端。

    chat.client.broadcastMessage = function (name, message) {    //TODO:接收服务器推送的消息};

    而下面的代码则是为了确保在将消息发送到服务器之前已经与服务器建立了连接。.done 函数表示连接成功后为发送的按钮绑定一个单击事件。

    // 与服务器建立连接后才能发送消息到服务器$.connection.hub.start().done(function () {    $('#sendmessage').click(function () {        // 调用服务器端的ChatHub.Send方法,把消息发送到服务器        chat.server.send("name", "message");    });});

    保存项目,并按F5运行,就可以实现B/S模式下的即时通讯。

    四、运行结果

    项目运行起来后,同时用多个浏览器打开的,输入各自的姓名之后,就能够实现即时通讯了。回到我们的vs,还能够看到自动生成的hubs脚本文件,如下图所示。

    Asp.net如何通过SignalR2进行实时聊天

    Asp.net如何通过SignalR2进行实时聊天

    三个不同的浏览器中的运行方式。 当 Tom、 Anand 和 Susan 发送消息时,所有浏览器实时更新:

    Asp.net如何通过SignalR2进行实时聊天

    在ServerHub重写一个 OnConnected 方法来监控客户端的连接情况,程序运行的时候web页面就使用$.connection.hub.start() 与signalR服务开始建立连接了,在调试的时候可以在输入中看到 "客户端连接成功!"

    public override Task OnConnected(){    System.Diagnostics.Trace.WriteLine("客户端连接成功!");    return base.OnConnected();}

    Asp.net如何通过SignalR2进行实时聊天

    五、一对一聊天实例

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

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

    using Microsoft.AspNet.SignalR;using Microsoft.AspNet.SignalR.Hubs;using Newtonsoft.Json;using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Threading.Tasks;namespace WebApplication2{    [HubName("UserHub")]    public class UserHub : Hub    {        #region 字段        public static List users = new List();        #endregion 字段        #region 方法        //获取所有用户在线列表        private void GetUsers()        {            var list = users.Select(s => new { s.Name, s.ConnectionID }).ToList();            string jsonList = JsonConvert.SerializeObject(list);            Clients.All.getUsers(jsonList);        }        //登记名字        public void LoginIn(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();        }        //发送消息        [HubMethodName("sendMessage")]        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("该用户已离线");            }        }        ///         /// 重写连接事件        ///         ///         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);        }        #endregion 方法    }    public class User    {        #region 构造函数        public User(string name, string connectionId)        {            this.Name = name;            this.ConnectionID = connectionId;        }        #endregion 构造函数        #region 属性        [Key]        public string ConnectionID { get; set; }        public string Name { get; set; }        #endregion 属性    }}

    到此,相信大家对“Asp.net如何通过SignalR2进行实时聊天”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: Asp.net如何通过SignalR2进行实时聊天

    本文链接: https://lsjlt.com/news/330336.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Asp.net通过SignalR2进行实时聊天
      目录一:什么是signalR1、SignalR传输方式1、HTML5 传输2、Comet 传输2、SignalR连接模式二、服务端1、添加服务端Hub2、添加OWIN 启动类三、客户...
      99+
      2024-04-02
    • Asp.net如何通过SignalR2进行实时聊天
      本篇内容主要讲解“Asp.net如何通过SignalR2进行实时聊天”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Asp.net如何通过SignalR2进行实时聊天”吧!一:什么是signalR...
      99+
      2023-06-30
    • PHP中如何进行即时聊天开发?
      随着即时通讯技术的不断发展,越来越多的网站和应用程序开始提供即时聊天功能。对于一个有经验的开发者来说,开发一个即时聊天功能似乎并不是很困难。本文将探讨如何在PHP中进行即时聊天开发,帮助初学者和有经验的开发者完成这一任务。一、什么是即时聊天...
      99+
      2023-05-22
      开发 PHP 即时聊天
    • go语言如何实现即时通讯聊天室
      本文小编为大家详细介绍“go语言如何实现即时通讯聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何实现即时通讯聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现的功能:公聊,私聊,修改用户名...
      99+
      2023-06-30
    • 300行代码实现go语言即时通讯聊天室
      学了2年Java,因为工作原因需要转Golang,3天时间学习了下go的基本语法,做这样一个聊天室小项目来巩固串联一下语法。 实现的功能:公聊,私聊,修改用户名 只用到了四个类: m...
      99+
      2024-04-02
    • SpringBoot中webSocket如何实现即时聊天
      这篇文章主要介绍了SpringBoot中webSocket如何实现即时聊天,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。springboot是什么springboot一种全新...
      99+
      2023-06-14
    • 如何用PHP websocket实现网页实时聊天
      目录前言websocket简介与http的关系握手数据传输PHP 实现 websocket 服务器文件描述符创建服务器socket服务器逻辑客户端创建客户端页面功能用户名异步处理总结...
      99+
      2024-04-02
    • 如何在实时 Linux Shell 中通过 Python 进行自动化部署?
      Linux Shell 中通过 Python 进行自动化部署是一种高效的方法,可以节省时间和精力。在本文中,我们将介绍如何使用 Python 脚本来自动化部署,并演示如何在实时 Linux Shell 中使用 Python 进行自动化部署。...
      99+
      2023-09-24
      实时 linux shell
    • html5如何通过postMessage进行跨域通信
      这篇文章主要介绍html5如何通过postMessage进行跨域通信,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!工作中遇到一个需求,场景是:h6页作为预览模块内嵌在pc页中,用户在...
      99+
      2024-04-02
    • Node.js websocket如何使用socket.io库实现实时聊天室
      这篇文章主要介绍Node.js websocket如何使用socket.io库实现实时聊天室,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!认识websocketWebSocket p...
      99+
      2024-04-02
    • 如何利用微信小程序和php实现即时通讯聊天功能
      目录一、PHP7安装Swoole扩展1、自定义安装2、宝塔面板安装PHP swoole扩展二、配置nginx反向代理三、微信小程序socket合法域名配置四、效果演示和代码1、小程序...
      99+
      2024-04-02
    • 如何进行ASP.NET MVC应用程序执行过程的分析
      本篇文章给大家分享的是有关如何进行ASP.NET MVC应用程序执行过程的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建一个简单的ASP.NET MVC应用程序ASP....
      99+
      2023-06-17
    • websocket+node.js如何实现实时聊天系统问题咨询
      小编给大家分享一下websocket+node.js如何实现实时聊天系统问题咨询,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1...
      99+
      2024-04-02
    • 如何通过实现ThreadFactory来对线程进行命名
      这篇文章主要介绍如何通过实现ThreadFactory来对线程进行命名,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文记录@Async的基本使用以及通过实现ThreadFactory来实现对线程的命名。@Async...
      99+
      2023-06-15
    • ASP.NET通过Web.config实现验证账号密码是否正确进行登录
      抛出问题 需要2个账号,一个账号为admin ,密码:123 另外一个账号为guest ,密码:1234 不允许匿名用户,和账号为guest的登录 代码实现 <confi...
      99+
      2024-04-02
    • ASP.NET 5是如何通过XRE实现跨平台的
      这篇文章给大家介绍ASP.NET 5是如何通过XRE实现跨平台的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。.NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开...
      99+
      2023-06-17
    • 如何使用Redis和Node.js开发实时聊天功能
      如何使用Redis和Node.js开发实时聊天功能随着互联网的发展,实时通信已成为许多网站和应用程序必不可少的功能之一。在众多实时通信的技术中,Redis和Node.js的结合是一种非常强大和流行的选择。Redis是一种高性能的键值存储数据...
      99+
      2023-10-22
      redis nodejs 实时聊天
    • 如何使用Redis和Swift开发实时聊天功能
      如何使用Redis和Swift开发实时聊天功能引言:实时聊天功能已经成为现代社交应用中不可或缺的一部分。在开发社交应用时,我们经常需要使用实时聊天来提供用户之间的互动和信息交流。为了达到实时性和高可用性的要求,我们可以使用Redis和Swi...
      99+
      2023-10-22
      Swift redis 实时聊天
    • 如何进行TCP通信实现
      本篇文章给大家分享的是有关如何进行TCP通信实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TCP是底层通讯协议,定义的是数据传输和连接方式的规范。TCP协议,传输控制协议(...
      99+
      2023-06-05
    • 如何使用C#基于Socket的TCP通信实现聊天室
      这篇文章给大家分享的是有关如何使用C#基于Socket的TCP通信实现聊天室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下一.Socket(套接字)通信概念套接字(socket)是通信的基石,用于描述...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作