【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

相关文章
|
22天前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
19 1
|
23天前
|
C#
C# DataTable不能通过已删除的行访问该行的信息
C# DataTable不能通过已删除的行访问该行的信息
|
29天前
|
安全 测试技术 C#
C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?
C#手术麻醉系统源码集成到医院信息系统涉及标准数据接口、患者信息同步、医嘱报告共享、实时监测数据传输及安全权限管理。通过这些步骤,确保信息的准确、及时和安全流动,提升医疗效率和服务质量。系统集成后需测试优化,以保证稳定性。图片展示了集成的不同方面。
|
2月前
|
XML 安全 JavaScript
B/S基于C#手术麻醉信息系统源码 手麻系统源码 有演示
手术室麻醉临床信息系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期,对病人进行全程跟踪与信息管理,自动集成病人HIS、LIS、RIS、PACS信息,采集监护等设备数据,根据质控要求自动生成电子单据, 系统提供智能手术排班、科室耗材管理、麻醉收费、主任管理、电子处方等业务功能,高度整合各科室应用需求,实现手术麻醉过程的无纸化和医疗流程的规范化,为手术室全面信息化提供了整体解决方案。
18 1
B/S基于C#手术麻醉信息系统源码 手麻系统源码 有演示
|
4月前
|
传感器 API 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C#)
33 1
|
4月前
|
运维 数据挖掘 C#
C#大型LIS检验信息系统项目源码
LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地看到患者的检验结果。
33 0
|
9月前
|
存储 C# C++
Baumer工业相机堡盟相机做寄存器进行读写保存字符串信息(C++/C#)
Baumer工业相机堡盟相机做寄存器进行读写保存字符串信息(C++/C#)
77 0
|
5月前
|
数据管理 BI 项目管理
C#实验室检验科LIS信息系统源码
医院设备信息维护是针对医院实际存在的检验设备,每台接入LIS系统的设备单独对应一条设备信息。
34 1
|
5月前
|
开发框架 前端开发 NoSQL
【C#】医学实验室云LIS检验信息系统源码 采用B/S架构
【C#】医学实验室云LIS检验信息系统源码 采用B/S架构
67 0
|
5月前
|
前端开发 JavaScript BI
【C#】云LIS检验医学信息系统源码
【C#】云LIS检验医学信息系统源码
43 0