一、SignalR是什么

Asp.net SignalR是微软为实现实时通信的一个类库。一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信。另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下。

SignalR内部有两类对象:

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

Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。

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

二、为什么要用SignalR

聊天室,如在线客服系统,IM系统等

消息的实时推送服务

巡更人员位置的实时推送

1. server     -------- 创建一个MVC 项目,选择新建的项目,右击-->选择管理NuGet程序包-->搜索 signalr--> 安装Microsoft ASP.NET SignalR

新建启动程序 Startup.cs

在类中添加代码:

app.MapSignalR();

在集线器类ChatHub.cs中添加如下代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using System.Threading.Tasks;
namespace ChatServer
{
public class ChatHub : Hub
{
public void Hello()
{
//Clients.All.hello();
//Clients.All.AddMsg();
} /// <summary>
/// 供客户端调用的服务器端代码
/// </summary>
/// <param name="message"></param>
public void Send(string name,string message)
{
// 调用所有客户端的sendMessage方法
Clients.All.sendMessage(name, message);
Trace.WriteLine("调用所有客户端的sendMessage方法"); } /// <summary>
/// 客户端连接的时候调用
/// </summary>
/// <returns></returns>
public override Task OnConnected()
{
Trace.WriteLine("客户端连接成功");
return base.OnConnected();
} }
}

  

2. 客户端(winform)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.AspNet.SignalR.Client;
namespace ChatClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Text = "Test SignalR";
FormClosing += Form1_FormClosing;
} public IHubProxy HubProxy { get; set; }
const string ServerURI = "https://localhost:44306/";//ServerURI = "https://localhost:44306/signalr";
public HubConnection Connection { get; set; } /// <summary>
/// Creates and connects the hub connection and hub proxy. This method
/// is called asynchronously
/// </summary>
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
Connection.Closed += ShowConnectionClosed;
HubProxy = Connection.CreateHubProxy("ChatHub");
//Handle incoming event from server: use Invoke to write to console from SignalR's thread
HubProxy.On<string, string>("sendMessage", (name, message) => {
this.Invoke(
new Action(() =>
{
RichTextBoxConsole.AppendText(String.Format("{0}: {1}\r", name, message));
}
));
}
); try
{
await Connection.Start();
}
catch (HttpRequestException)
{
Text = "Unable to connect to server: Start server before connecting clients.";
//No connection: Don't enable Send button or show chat UI
return;
} TextBoxMessage.Focus();
RichTextBoxConsole.AppendText("Connected to server at " + ServerURI + "\r");
}
private void CloseConnection()
{
if (Connection != null)
{
Connection.Stop();
Connection.Dispose();
}
} /// <summary>
/// If the server is stopped, the connection will time out after 30 seconds (default), and the
/// Closed event will fire.
/// </summary>
private void ShowConnectionClosed()
{
RichTextBoxConsole.AppendText("You have been disconnected.\r\n");
} private void btnConnect_Click(object sender, EventArgs e)
{
RichTextBoxConsole.AppendText("Connecting to server...");
ConnectAsync();
}
private void btnSend_Click(object sender, EventArgs e)
{
if (Connection.State == Microsoft.AspNet.SignalR.Client.ConnectionState.Disconnected)
{
ShowConnectionClosed();
return;
}
HubProxy.Invoke("Send", "Client wgscd", TextBoxMessage.Text);
TextBoxMessage.Text = String.Empty;
TextBoxMessage.Focus();
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
CloseConnection();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
CloseConnection();
} }
}

  

C# Winform cilent call SignalR的更多相关文章

  1. 基于ABP框架的SignalR,使用Winform程序进行功能测试

    在ABP框架里面,默认会带入SignalR消息处理技术,它同时也是ABP框架里面实时消息处理.事件/通知处理的一个实现方式,SignalR消息处理本身就是一个实时很好的处理方案,我在之前在我的Winf ...

  2. SignalR的简单使用(二)

    原文:SignalR的简单使用(二) 之前提到SignalR代理在网页,通过生成的Js来完成相关的功能.但我不禁想一个问题, 难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动 ...

  3. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  4. OWIN 自托管静态网站

    我们知道,借助OWIN,WebApi,SignalR,WCF 都可以创建自托管(Self-Host)实例,完全不需要IIS,静态网站也可以. 最近做一个服务器监控小工具,用 SignalR 通信,监控 ...

  5. .net SignalR winform 推送广播

    最近在做一个项目,需要用到服务端主动推送给客户端,最开始用的是自己比较顺手的Remoting,可后来发现把服务端架到外网上,就猴子它哥了,后来又尝试WCF,虽然能推送,但是推了几次也猴子它哥了,后来找 ...

  6. WinForm中 Asp.Net Signalr消息推送测试实例

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  7. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  8. SignalR实现网页实时聊天功能

    SignalR是利用html5 sokit方式实现网页的实时性,在客户端不支持html5的情况下通过轮询实现 实现原理是客户端发送的消息先去服务器,然后服务器根据需要将消息广播到需要接收信息的客户群. ...

  9. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

  10. signalr服务端-基础搭建

    signalr 支持 iis托管.winform.windowsservices.wpf 托管 这里我采用winfrom托管 首先画一个这样的窗体 在服务项目通过项目管理包安装signalr类库 安装 ...

随机推荐

  1. 海外SRC信息收集工具

    海外SRC信息收集 ​ 子域名爆破工具:bbot,subfinder ​ 相关测评:https://blog.blacklanternsecurity.com/p/subdomain-enumerat ...

  2. FPGA开发中的复位问题

    一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...

  3. Linux系统搭建性能测试监控体系

    一.安装Grafana 1.Grafana介绍(默认端口3000): Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB.promethe ...

  4. 使用yt-dlp下载youtube高清2k 60fps视频

    只演示windows下的操作,linux和mac应该差不多的命令行. 首先放上github仓库地址:https://github.com/yt-dlp/yt-dlp 它的介绍: 厉害啊,支持数千个网站 ...

  5. app&小程序&web安全—sign签名绕过

    零.前言 在web界面登陆时,小程序和app传输数据时经常会碰到签名,会对请求的参数进行签名,如果自己修改了数据包就会校验失败非常麻烦. 本文编写的契机就是因为碰到了一个JeecgBoot的小程序, ...

  6. Python模块之functools.partial

    在Python编程中,functools.partial是一个强大的工具,它提供了一种部分应用函数的方式,能够在创建新函数时固定部分参数,从而在后续调用中减少需要传递的参数数量.本文将深入介绍func ...

  7. 系统日志查询之journalctl

    journalctl是什么 查询系统日志的工具 journalctl -xe是什么意思 -xe是排查问题时最常用的参数:-e 从结尾开始看-x 相关目录(如:问题相关的网址) journalctl - ...

  8. pip之常见错误汇总

    基本使用: 1.安装文件中的包 pip install -r requirements.txt 问题: 1. pip._vendor.urllib3.exceptions.ReadTimeoutErr ...

  9. 用人工智能模型预测股市和加密货币的K线图

    前一篇:<从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅> 前言:加密货币市场昨日大幅下跌,一天内市值蒸发逾70亿 人民币.有人可能会问,如果使用人工智能模型预测市场的涨跌,是否能 ...

  10. 2024年1月Java项目开发指南3:创建Springboot项目

    本文档编写于贰零贰肆年一月八日@萌狼蓝天 如果你不知道什么是springboot,那么你只需要知道,这是一个让我们减少配置工作量,方便开发的开发框架,能让我们更专心于业务开发,省的被各种各样的配置浪费 ...