SignalR实现服务器与客户端的实时通信

C#基于SignalR实现网页端,服务器,桌面端,甚至移动端实时通信 为实现网页与服务器实时互动,并且可以跟桌面端程序,甚至移动端App实时互动,查阅了很多资料,其中网页端限制较多,能实现的技术主要有socket.io,websocket和signalR,因为我只是个C#开发者,显然signalR更便于使用,如果你擅长Node.js,建议使用socket.io,当然这里面没有优劣之分,哪个方便用哪个。据部分资料介绍,SignalR配合redis,也能实现千万人在线功能。 阅读详情

SignalR实现服务器与客户端的实时通信

百度百科给它的定义

实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。

WebSockets是HTML5提供的新的API,可以在Web网页与服务器端间建立Socket连接,当WebSockets可用时(即浏览器支持Html5)SignalR使用WebSockets,当不支持时SignalR将使用其它技术来保证达到相同效果。
SignalR当然也提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,并且非常 方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用SignalR都非常容易实现。

它的作用

SignalR 将与客户端进行实时通信带给了ASP .NET 。当然这样既好用,而且也有足够的扩展性。以前用户需要刷新页面或使用Ajax轮询才能实现的实时显示数据,现在只要使用SignalR,就可以简单实现了。最重要的是您无需重新建立项目,使用现有ASP .NET项目即可无缝使用SignalR。

它最强吸引我的地方

应该说,首次听到signalR给我最大的振奋就是它与服务器的实时通信,要知道,以往的十几年里,客户端要想实时与服务器通信,那只有通过长轮询,当AJAX出现之后,这种长轮旬变得漂亮一些,但也终规是轮询,即服务器永远是被动的,客户端你真的很累,呵呵!

实例代码

下面我将以一个非常简单的例子说一个signalR的威力,主要功能是,一个网页,有个登陆,登陆成功后,由服务器去通信客户端,并回调客户端的方法,登出后,同时这样的流程,看一下核心代码:
一 首先引用相关DLL
二  Startup文件为SignalR的入口
复制代码
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(SignalR.Core.Startup))]
namespace SignalR.Core
{

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }

    }
}
复制代码

三 一组SignalR的JS文件

四 实现具体业务的核心类文件,它需要集成Hub,需要使用特性HubName为SignalR起个名字,以便在客户端去调用它

复制代码
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using SignalR.Core.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace SignalR.Core
{

    [HubName("UrlHub")]
    public class UrlValid : Hub
    {
        static List<CurrentUser> ConnectedUsers = new List<CurrentUser>();
        public void Connect(string url)
        {
            var id = Context.ConnectionId;
            var userID = (HttpContext.Current.Session == null ? "" : HttpContext.Current.Session["UserID"] ?? "").ToString();
            if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
            {
                ConnectedUsers.Add(new CurrentUser
                {
                    ConnectionId = id,
                    UserID = userID,
                });
                Clients.Caller.onConnected(id, userID, url);
                //Clients.AllExcept(id).onNewUserConnected(id, userID);

                Clients.Client(id).onNewUserConnected(id, userID);
            }
            else
            {

                Clients.Caller.onConnected(id, userID, url);
                Clients.Client(id).onExistUserConnected(id, userID);
                // Clients.AllExcept(id).onExistUserConnected(id, userID);
            }
        }

        /// <summary>
        /// 登出
        /// </summary>
        public void Exit()
        {
            var id = Context.ConnectionId;
            var userID = (HttpContext.Current.Session == null ? "" : HttpContext.Current.Session["UserID"] ?? "").ToString();

            OnDisconnected();
            Clients.Caller.onConnected(id, userID, "");
            Clients.Client(id).onExit(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.UserID);

            }
            return base.OnDisconnected();
        }

    }
}
复制代码

五 核心JS功能代码片断

复制代码
    <!--Reference the jQuery library. -->
    <script src="/Scripts/jquery-1.8.2.min.js"></script>

    <!--Reference the SignalR library. -->
    <script src="/Scripts/jquery.signalR-1.0.0.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="/signalr/hubs"></script>

    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub
            var chatHub = $.connection.UrlHub;
            registerClientMethods(chatHub);
            // Start Hub
            $.connection.hub.start().done(function () {
                registerEvents(chatHub);
            });

        });

        //注册客户端事件
        function registerEvents(chatHub) {
            $("#btn").click(function () {
                var url = "dasfjasldfj";
                chatHub.server.connect(url);
            });

            $("#logOut").click(function () {
                chatHub.server.exit();
            });

        }

        //注册客户端方法
        function registerClientMethods(chatHub) {

            chatHub.client.onConnected = function (id, userID, url) {
                console.log("与服务器建立了链接" + url);
            }

            chatHub.client.onUserDisconnected = function (id, userID) {
                console.log("与服务器取消了链接");
            }

            chatHub.client.onNewUserConnected = function (id, userID) {
                alert("新用户完成为合法");
            }

            chatHub.client.onExistUserConnected = function (id, userID) {
                alert("用户" + userID + "不能重复登陆");
            }

            chatHub.client.onExit = function (id, userID) {

                alert("用户" + userID + "成功退出!");
            }

        }

    </script>
复制代码

OK,现在运行你的程序,就可以实现客户端与服务器端实时通信了,利用这些特性,我们是不是可以实现很多事情呀,让消息推送更可靠吧!

C++和Qt框架实现的SignalR客户端服务器实战 SignalR 是一个由微软开发的开源库,用于在服务器和客户端之间进行实时通信。它简化了实时Web功能的开发,使得开发者能够轻松地在不同平台间实现双向通信,特别是支持了多客户端类型,包括Web浏览器、移动设备和桌面应用程序。Qt 是一个跨平台的应用程序和用户界面框架,广泛用于开发图形用户界面(GUI)程序,同时也适用于非GUI程序。它是由挪威的TrollTech公司开发的,现已开源并由Digia公司负责商业化运营。Qt 的主要特点包括:跨平台性。 阅读详情

相关推荐

Winform与MVC通过SignalR实现双向实时通信

SignalR是ASP.NET的一个开源库,用于简化服务器和客户端之间的实时双向通信。它支持多种网络传输协议,包括WebSockets、Server-Sent Events和Forever Frame等。SignalR拥有自我恢复机制,能够在网络环境不稳定时自动重连,非常适合需要实时数据交互的应用场景,如聊天应用、实时投票系统或协作工具。在本章中,我们将介绍SignalR的基本功能,并逐步深入探讨其架构、安装流程和最佳实践。

weixin_33193177的博客 1261

signalR服务端调用客户端方法说明

所有连接的客户。 Clients.All.addContosoChatMessageToPage(name, message); 只有呼叫客户端。 Clients.Caller.addContosoChatMessageToPage(name, message); 除呼叫客户端外的所有客户端。 Clients.Others.addContosoChatMessag...

梦誉晨的博客 6109

SignalR-java-client:https

适用于Java和Android的ASP.NET SignalR ASP.NET SignalR是ASP.NET开发人员的新库,它使向应用程序中添加实时Web功能变得异常简单。 什么是“实时网络”功能? 可以让您的服务器端代码实时将内容推送到连接的客户端。 它可以用来做什么? 将数据从服务器推送到客户端(不仅仅是浏览器客户端)一直是一个棘手的问题。 SignalR使之轻松自如,并为您处理所有繁重的工作。 可以从常规Java或Android应用程序中使用该库。 文献资料 请参阅说明 执照 贡献 见 建立源 git clone git@github.com:SignalR/java-client.git (or https if you use https) 打开Android Studio,单击“导入非Android Studio项目”,然后选择克隆的目录 生成项目。 signalr

SignalR实时通讯

我这里使用signalr的动机是因为有些大屏数据和设备信息需要自动更新,当时我是使用的轮询的方式,当时轮询周所周知,再数据没有变化的情况下,是非常耗费资源的。闲暇的时候,更是不能使用轮询来造成额外的耗费。signalR 是一个开源的库,跨平台;可以让web应用与其他应用通讯变得非常简单,WEB服务端可以实时的将内容推送给对应的客户端,客户端发送的信息也可以实时到其他客户端。

Admans的专栏 1468

SignalR-实现web浏览器客户端与服务端的推送功能

SignalR-实现web浏览器客户端与服务端的推送功能 SignalR-实现web浏览器客户端与服务端的推送功能

Cadence IC 618实战:从与非门到环形振荡器的完整版图设计流程(含DRC/LVS避坑点)

本文详细介绍了使用Cadence IC 618进行从与非门到环形振荡器的完整版图设计流程,包括环境准备、基础设计规范、层次化设计、DRC/LVS验证及后仿真优化。特别提供了实战中的避坑技巧和优化建议,帮助工程师高效完成集成电路设计任务。

weixin_26886855的博客 405

signalr消息推送 java,实时显示数据 SignalR 及时消息提醒( 立即向其推送内容)...

//消息推送初始化连接var msg = $.connection.messageHub;msg.client.NotifyUser = function (id,message) {var count = $('[data-msg-count]').html();$('[data-msg-count]').html(parseInt(count) + 1);$('[data-notificati...

weixin_39846378的博客 695

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

而这里的牛牛不止设置了反代理还设置了证书校验,一闪而过的三个数据包就是在校验证书。而proxifier工具的转发机制获取的是网络接口出口数据,相当于是在网络接口设代理。这个时候就可以在夜神打开牛牛开始抓包了,打开牛牛可以看到proxifier有夜神流量通过。关闭代理之后牛牛就正常了,可恶的牛牛啊,这样我没办法抓包啊,怎么办啊。模拟器开启代理,burp开启监听。打开牛牛app,牛牛不在报错。牛牛app检测的是系统代理,也就是在模拟器或手机上设置的代理。再在浏览器下载两个模块,在夜神安装,用来屏蔽证书校验。

xiaoheizi的博客 7532

SignalR 实现 Web 客户端与服务器实时通信

SignalR 实现 Web 客户端与服务器实时通信简介ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相实时通知消息及调用方法。WebSockets是HTML5提供的新的API,可以在Web网页与服务器端间建立Socket连接,当WebSockets可用时(即

能者为师 6890

无网络环境部署:手动获取并安装OneNote for Windows 10完整指南

本文提供了一份详尽的OneNote for Windows 10离线安装指南。针对无网络或内网隔离环境,详细介绍了如何从官方渠道获取正确的产品ID,利用第三方工具下载纯净的.appxbundle安装包,并解决系统兼容性与依赖框架问题。最后,通过PowerShell管理员命令完成安全部署,是IT管理员和高级用户在离线环境下部署UWP应用的实用参考。

loss4bartender的博客 496

【愚公系列】《AIGC辅助软件开发》041-如何使用 AI技术提升工作效率:AI辅助软件架构师实践

在数字化转型的浪潮中,软件架构师作为技术团队的核心,承载着系统设计与架构优化的重要责任。然而,随着项目复杂度的增加和技术环境的变化,架构师面临着前所未有的挑战。幸运的是,人工智能(AI)技术的迅猛发展为这一行业带来了新的机遇,帮助架构师提升工作效率、优化决策过程,并改善团队协作。本文将深入探讨AI如何辅助软件架构师的实际工作,具体分析AI在需求分析、架构设计、代码生成、测试和优化等环节的应用。

愚公智库 15万+

实现服务器端与客户端的实时通信 SignalR(1)

一、本文出处:SignalR 实例介绍(建议看原著里面有DEMO下载) 二、这篇文章介绍如何利用 VS2012 创建一个简单的实时聊天系统,建好后的样子如下(模拟三个在线用户):    三、Demo 创建    1、新建项目以及新建完成后的目录结构如下图所示:      2、 安装SignalR 程序包,该包实现了服务端与客户端的通信。 ...

weixin_30369041的博客 249

告别轮询!手把手教你用S32K3的FlexCAN Enhanced FIFO+DMA实现高效CAN FD数据接收

本文详细介绍了如何利用S32K3芯片的FlexCAN Enhanced FIFO与DMA组合方案,实现高效CAN FD数据接收,彻底告别传统轮询和中断模式。通过深度缓冲、智能过滤和DMA联动技术,该方案在5Mbps高负载场景下将CPU占用率从42%降至3%以下,显著提升系统实时性和吞吐量。

weixin_30906185的博客 504

使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知

构建实时应用程序已成为现代 Web 开发中必不可少的部分,尤其是对于通知、聊天系统和实时更新等功能。SignalR 是 ASP.NET 的一个强大库,可实现服务器端代码和客户端 Web 应用程序之间的无缝实时通信。在本指南中,我们将介绍如何使用最少 API 和 SignalR 在 .NET Core 8 中创建实时通知,确保您的应用程序保持响应速度快且引人入胜。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1万+

同步整流buck电路图设计:手把手入门必看

从零开始拆解同步整流Buck电路图及其原理,手把手带你画出关键拓扑、选型MOSFET、分析续流路径。重点讲清占空比控制逻辑与体二极管导通损耗的规避方法,让buck电路图及其原理真正落地可调、稳定可靠。

weixin_33308579的博客 997

Spring AI 项目实战(五):Spring Boot + AI + DeepSeek + Redis 实现聊天应用上下文记忆功能(附完整源码)

本文介绍了如何基于Spring Boot 3.2、Spring AI 1.0.0-M4、DeepSeek API和Redis构建具备上下文记忆功能的智能聊天应用。项目采用现代化技术栈,包括Java 17、Maven、Lombok等,实现了智能对话、会话管理、异常处理等核心功能。文章详细讲解了环境搭建、配置管理(含Redis和AI服务集成)、核心组件设计(如消息实体、控制器和服务层实现),以及完整的项目结构。该项目提供了美观的Web界面和REST API,支持对话上下文存储(通过Redis实现)和系统监控,可

博客 830

MVC中使用signalR入门教程

一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态。全身都有点酸痛,这个可能一个星期只有周末才打一次球有关吧。好吧还是说说正经的,厂里的牛哥昨天分配给我一个任务,大概的一个意思就是“用这个signalR发送一条消息给客户端,客户端进行反馈响应”。任务听起来似乎很简单,但是没接触过signalR这玩意,我也是挺郁闷了...

dotNet全栈开发 1万+

Debezium系列之:深入理解 Debezium Topic的设置要求

Debezium系列之:配置 Debezium Topic

zhengzaifeidelushang的博客 1009
上一篇: com.sun.net.httpserver内存泄露的问题
下一篇: 在MySQL字段中使用逗号分隔符
zljjava
博客等级 码龄15年 155粉丝 15原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值