【C#】SignalR之主动推送信息的简单解决方案

简介: 在本篇文章中,将讲讲C#如何使用SignalR通讯Core下的SignalR实现原理一样,只是写法不一样,主动推送消息的场景使用:页面登录后台管理系统,最新订单信息的通知等
作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More

1、信息推送效果

Form窗体下使用SignalR,通过页面客户端触发服务端,在服务端触发一次后,开启一个定时器,让定时器给加入到连接列表的客户端主动推送消息

image.png

2、主动推送,客户端和服务端相互判定

1)服务端关键代码


using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Timers;
 
namespace SignalRForm
{
    public class TestHub:Hub
    {
        #region 初始化 - 构造函数/以及服务
        public static bool isInite = false;
        public static List<string> list = null;
        Timer timer = null;
 
        static TestHub()
        {
            list = new List<string>();
 
            if (isInite)
            {
                Console.WriteLine("再次运行!");
            }
            
            //客户端第一个调用服务端方法时,执行一次构造函数
            Console.WriteLine("TestHub_Init");
        }
 
        public void MyTimer(object sender, ElapsedEventArgs e)
        {
            timer.Stop();
 
            Clients.Clients(list).getNowTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            timer.Start();
        }
 
        public void initServer(string userGuid)
        {
            if (!isInite)
            {
                //读取txt文档内容
                string str;
                StreamReader sr = new StreamReader("d://template.txt", false);
                str = sr.ReadLine().ToString();
                sr.Close();
 
                if (!string.IsNullOrEmpty(str))
                {
                    string[] arr = str.Split(',');
                    foreach (string item in arr)
                    {
                        if (!string.IsNullOrEmpty(item))
                        {
                            list.Add(item);
                        }
                    }
                }
 
                isInite = true;
                timer = new Timer(1000); //每隔500毫米执行一次方法
                timer.Enabled = true;
                timer.Elapsed += MyTimer;
                if (list.Count > 0)
                    Clients.Clients(list).getNowTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }
        #endregion
 
        #region 客户端连接 - 服务器端监听
        public override Task OnConnected()
        {
            //将内容写入到txt文档
            StreamWriter sw = new StreamWriter("d://template.txt", true);
            sw.WriteLine(Context.ConnectionId + ",");
            sw.Close();
 
            list.Add(Context.ConnectionId);
 
            return base.OnConnected();
        }
        #endregion
 
        #region 客户端断开连接
        public override Task OnDisconnected(bool stopCalled)
        {
            //将内容写入到txt文档
            StreamWriter sw = new StreamWriter("d://templateout.txt", true);
            sw.WriteLine(Context.ConnectionId + ",");
            sw.Close();
 
            return base.OnDisconnected(stopCalled);
        }
        #endregion
 
        #region 客户端重新连接
        public override Task OnReconnected()
        {
            //将内容写入到txt文档
            StreamWriter sw = new StreamWriter("d://template.txt", true);
            sw.WriteLine("再次连接!" + isInite);
            sw.Close();
 
            return base.OnConnected();
        }
        #endregion
    }
}

2)客户端关键代码

<!DOCTYPE html>
<html style="height: 100%">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>测试SignalR主动推送</title>
    <script type="text/javascript" src="~/jQuery/jquery-2.0.0.min.js"></script>
    <script type="text/javascript" src="~/jQuery/jquery.signalR-2.2.0.min.js"></script>
    @*<script src="http://localhost:8686/signalr/hubs"></script>*@
    <script src="http://192.168.1.25:8686/signalr/hubs"></script>
 
    <style type="text/css">
 
        body, html {
            margin: 0;
            padding: 0;
        }
 
        /*-----clear-----*/
        .clear {
            *zoom: 1;
        }
 
            .clear:after {
                content: '';
                display: table;
                clear: both;
            }
    </style>
</head>
<body>
 
    <div id="nowTime"></div>
    <input id="runTime" type="hidden" />
</body>
</html>
 
<script type="text/javascript">
 
    var runTime = "";
    test();
    function test() {
 
        $(function () {
 
            try {
                //$.connection.hub.url = "http://localhost:8686/signalr"; //连接到SignalR服务端
                $.connection.hub.url = "http://192.168.1.25:8686/signalr"; //连接到SignalR服务端
 
                $.connection.hub.start().done(function (data) {
 
                    //服务端方法的回调函数:OnConnected、OnDisconnected、OnReconnected?
                    //在此方法初始化
                    chat.server.initServer("companyid");
                }).fail(function () {
                    console.log("实时消息服务连接失败!");
                });
 
                var chat = $.connection.testHub; //继承了Hub的类,用于客户端调用服务端类的方法
 
                //监听服务端方法判断是否初始化服务成功
                //chat.server.getNowTime(); //Connection must be started before data can be sent. Call .start() before .send()
                chat.client.getNowTime = function (data) {
                    
                    $("#runTime").val(data);
 
                    $("#nowTime").html(data);
                }
            }
            catch (ex) {
                console.log(ex);
            }
        });
    }
 
    setInterval(function () {
        
        if (runTime == $("#runTime").val()) {
            test();
        }
        else {
            runTime = $("#runTime").val();
        }
 
    }, 10 * 1000);
</script>

3、其他注意事项

1、可以先删除再添加【注意:最后一定要加斜杠】
netsh http delete urlacl url=http://localhost:8686/

2、添加网址【注意:最后一定要加斜杠】
netsh http add urlacl url=http://localhost:8686/ user=Everyone

3、查看所有使用到的端口

netstat -ano

image.png

相关文章
|
5月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
164 1
|
5月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
96 2
|
5月前
|
C#
C# DataTable不能通过已删除的行访问该行的信息
C# DataTable不能通过已删除的行访问该行的信息
|
3月前
|
BI 数据处理
一体化的医学实验室信息系统源码,C#LIS系统源码
面向医学实验室的一体化平台提供标本流程管理、报告发布及科室管理支持。它与HIS无缝对接,简化患者信息录入,实现检验结果实时同步。系统自动处理数据、分类样本、计算参考范围,并对异常结果预警。条码管理简化样本追踪,质控管理提升检测准确性。平台还支持数据审核发布、历史结果查询对比、灵活报表打印及统计分析等功能,辅助科室管理和试剂库存控制,加强科室间沟通协作。
一体化的医学实验室信息系统源码,C#LIS系统源码
|
4月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
76 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
2月前
|
存储 搜索推荐 C#
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中
37 0
|
3月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
36 0
|
存储 C# C++
Baumer工业相机堡盟相机做寄存器进行读写保存字符串信息(C++/C#)
Baumer工业相机堡盟相机做寄存器进行读写保存字符串信息(C++/C#)
107 0
|
5月前
|
传感器 API 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C#)
62 1
|
5月前
|
数据管理 BI 项目管理
C#实验室检验科LIS信息系统源码
医院设备信息维护是针对医院实际存在的检验设备,每台接入LIS系统的设备单独对应一条设备信息。
60 1