SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升,5个Demo贯彻全篇,感兴趣的玩才是真的学)

官方demo:http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

应用情景之一:

没太多连续的时间来研究SignalR,所以我把这篇文章分了三个阶段:

第一个阶段,简单使用,熟悉并认识SignalR

第二个阶段,实现上图的单聊效果

第三个阶段,实现类似QQ群发的功能

扩展阶段,如果有时间,逆天会再开一篇,封装一个LoTSignalR,看过逆天封装的人都知道,绝对简单又轻量级

比如LoTQQ,现在已经很多人在用了,后期会添加新功能,敬请期待~~

++++++++++++++++++ 我是华丽的分割线 +++++++++++++++++++++

步入正轨:

第一个阶段:

1.什么是ASP.NET SignalR?

ASP .NET SignalR是一个 ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。

WebSockets是Html5提供的新的API,可以在Web网页与服务器端间建立Socket连接,当WebSockets可用时(即浏览器支持Html5)SignalR使用WebSockets,当不支持时SignalR将使用其它技术来保证达到相同效果。

SignalR当然也提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,并且非常 方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用SignalR都非常 容易实现。

2.可以使用ASP.NET SingalR做什么?
SignalR 将与客户端进行实时通信带给了ASP .NET 。当然这样既好用,而且也有足够的扩展性。以前用户需要刷新页面或使用Ajax轮询才能实现的实时显示数据,现在只要使用SignalR,就可以简单实现了。

最重要的是您无需重新建立项目,使用现有ASP .NET项目即可无缝使用SignalR。

网上某架构图:

上面乱七八糟的估计很多人懒得看,好吧,你可以这样理解:

使用了SignalR就可以让客户端通过SignalR代理直接调用服务端的方法,让服务端通过SignalR直接调用客户端的方法

下面我们来实例演示一下,先演示一下不用IIS的情况:

新建一个控制台项目,引入 signalR Self Host (可以思考一下为什么会用NuGet包,他到底好在哪?O(∩_∩)O~不清楚等项目演示完你应该就知道了

这是他的依赖项

安装一下Owin.Cors

依赖项:

新增一个Owin的Startup类,类似于我们传统项目的Global文件

注册一下signalR中间组件(学过mvc的可以变相的理解为注册路由之类的)

在main方法中绑定端口(不一定是8080,比如我demo中就用的其他端口)

创建一个“SignalR集线器”(控制台这边因为没有集线器所以只能自己建类)

建了一个DntHub,定义了一个服务器端的方法,叫ServiceSend(一会会用到)

转到定义,看看Hub类(好东西啊,还有分组啥的,下面会讲)

运行一下,如果出错请参考我的这篇文章:Owin:“System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生 - 毒逆天 - 博客园

先看看共引用多少dll(和MVC之类的比起是不是简洁很多?一会演示好处在哪)最小引用

创建一个web的Client,引用一下 SignalR的js包,其实你会发现就是多了几个js包并没有引用任何dll(必须的,不然岂不是太臃肿?)

前端的调用步骤:

    <!--总结一下:1.先引入jq包,再引入signalR的js包,再引入signalR动态生成的hubs2.设置signalR的hubs url地址:$.connection.hub.url =xxx3.声明一个代理对象来引用集线器:var chat = $.connection.dntHub;4.创建一个客户端方法:chat.client.xxxx=function(){}5.启动并调用服务端方法:$.connection.hub.start().done(function(){chat.server.xxx()});-->

代码贴起:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>简单聊天程序</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><script src="Scripts/jquery-1.8.3.min.js"></script><script src="Scripts/jquery.signalR-2.2.0.js"></script><!--动态生成的--><script src="http://localhost:5438/signalr/hubs"></script><script type="text/javascript">$(function () {//日记记录$.connection.hub.logging = true;//设置hubs的url$.connection.hub.url = "http://localhost:5438/signalr";// 声明一个代理来引用该集线器。var chat = $.connection.dntHub;// 创建一个方法供服务端调用chat.client.addMessage = function (name, message) {var encodedName = $('<div />').text(name).html();var encodedMsg = $('<div />').text(message).html();$('#discussion').append('<li><strong>' + encodedName + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');};$('#displayname').val('路人');// 启动 connection$.connection.hub.start().done(function () {$('#sendmessage').click(function () {//调用服务器端方法chat.server.serviceSend($('#displayname').val(), $('#message').val());});});});</script><!--总结一下:1.先引入jq包,再引入signalR的js包,再引入signalR动态生成的hubs2.设置signalR的hubs url地址:$.connection.hub.url =xxx3.声明一个代理对象来引用集线器:var chat = $.connection.dntHub;4.创建一个客户端方法:chat.client.xxxx=function(){}5.启动并调用服务端方法:$.connection.hub.start().done(function(){chat.server.xxx()});-->
</body>
</html>

如果要调试的话,保证服务端先运行,调试小技巧:

下面说一下上面的好处:

webclient我就单独拿出来了(一个js包,一个index.html),控制台的程序我也单独拿出来了,下面先运行一下服务端,再打开index.html

再次验证最上面说的,端口不固定

第二个阶段:

QQ聊天案例,先讲一种常规的方法,下面会讲一种简单方法

先看看gif效果图把

定义一个BaseHub类,里面用 qqModeList来临时存放数据(用户数据)

QQModel,目前就用到两个属性,其他的可以自己扩展

定义了一个上线方法,一会每个客户端都会调用(本来是准备用OnConnected的,没办法他没参数。。。而且这个时候,qq昵称还没有产生,于是我取其次的方案)

定义一个发消息的方法

下面就是前端的东西了,注释很详细,不清楚可以直接留言,我没高兴深度封装,主要就是简单演示一下

代码贴上:

客户端-逆天

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>仿QQ聊天--我是逆天</title><link href="Style/MyQQ.css" rel="stylesheet" />
</head>
<body><div><input id="inputMsg" /><input id="btn" type="button" value="发消息" /></div><br /><br /><div id="main"></div><script src="Scripts/jquery-2.2.1.min.js"></script><script src="Scripts/jquery.signalR-2.2.0.min.js"></script><script src="http://localhost:5438/signalr/hubs"></script><script type="text/javascript">$(function () {var leftHtml = ['<div class="sender">','<div><img src="http://img.jfdown.com/jfdown/201403/ygald3wajct.jpg"></div>','<div><div class="left_triangle"></div>','<span>{msg}</span></div></div>'].join('');var rightHtml = ['<div class="receiver">','<div><img src="http://tb.himg.baidu.com/sys/portrait/item/306c9328?t=1397975854"></div>','<div><div class="right_triangle"></div>','<span>{msg}</span></div></div>'].join('');//设置hubs的url$.connection.hub.url = 'http://localhost:5438/signalR';// 声明一个代理var qqProxy = $.connection.qQHub;// 创建一个方法供服务端调用qqProxy.client.sendMsg = function (msg) {$('#main').append(leftHtml.replace('{msg}', msg));}// 启动 connection$.connection.hub.start().done(function () {qqProxy.server.online('逆天');//QQ昵称$('#btn').click(function () {//获取输入var qqmsg = $('#inputMsg').val();//给逆天发消息qqProxy.server.serviceSend('妹子', qqmsg);$('#main').append(rightHtml.replace('{msg}', qqmsg));});});});</script>
</body>
</html>

客户端-美女

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>仿QQ聊天--我是美女</title><link href="Style/MyQQ.css" rel="stylesheet" />
</head>
<body><div><input id="inputMsg" /><input id="btn" type="button" value="发消息" /></div><br /><br /><div id="main"></div><script src="Scripts/jquery-2.2.1.min.js"></script><script src="Scripts/jquery.signalR-2.2.0.min.js"></script><script src="http://localhost:5438/signalr/hubs"></script><script type="text/javascript">$(function () {var rightHtml = ['<div class="sender">','<div><img src="http://img.jfdown.com/jfdown/201403/ygald3wajct.jpg"></div>','<div><div class="left_triangle"></div>','<span>{msg}</span></div></div>'].join('');var leftHtml = ['<div class="receiver">','<div><img src="http://tb.himg.baidu.com/sys/portrait/item/306c9328?t=1397975854"></div>','<div><div class="right_triangle"></div>','<span>{msg}</span></div></div>'].join('');//设置hubs的url$.connection.hub.url = 'http://localhost:5438/signalR';// 声明一个代理var qqProxy = $.connection.qQHub;// 创建一个方法供服务端调用qqProxy.client.sendMsg = function (msg) {$('#main').append(leftHtml.replace('{msg}',  msg));}// 启动 connection$.connection.hub.start().done(function () {qqProxy.server.online('妹子');//QQ昵称$('#btn').click(function () {//获取输入var qqmsg = $('#inputMsg').val();//给逆天发消息qqProxy.server.serviceSend('逆天', qqmsg);$('#main').append(rightHtml.replace('{msg}', qqmsg));});});});</script>
</body>
</html>

第三阶段

群发

我们先接着昨天的QQ聊天来说

这次用一个简单的方法搞定

一个键值对集合存放ConnectionId和GroupName

每个客户端连接的时候会加入一个组

 断开的时候退出组

 发消息

前端也进行了优化。ok,signalR第三个demo诞生,比昨天简单多了

下面可以说说类似于QQ群的群发消息了

这个是逆天的自学笔记:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38315.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读报告:A Neural Approach to Pun Generation

论文阅读报告&#xff1a;A Neural Approach to Pun Generation 这篇报告是课上老师留下的作业&#xff0c;要求我们读一读论文找找感觉&#xff0c;顺便把论文的内容写一写&#xff0c;也算是我第一次认真完整地精读了一篇论文。由于水平有限&#xff0c;翻译理解的内容有拙劣…

【论文阅读】HRNetV2论文笔记

Titile: High-Resolution Representations for Labeling Pixels and Regions 论文地址&#xff1a;https://arxiv.org/pdf/1904.04514.pdf 代码地址&#xff1a;https://github.com/HRNet/HRNet-Object-Detection 1. 概 述 1. 概述 1.概述 基于深度学习的特征表示在计算机视觉…

表情识别综述论文《Deep Facial Expression Recognition: A Survey》中文翻译

本篇博客为论文《Deep Facial Expression Recognition: A Survey》的中文翻译&#xff0c;如有翻译错误请见谅&#xff0c;同时希望您能为我提出改正建议&#xff0c;谢谢&#xff01; 论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9039…

【论文阅读002】Generating Natural Language Adversarial Examples through ProbabilityWeightedWord Saliency

论文地址&#xff1a;Generating Natural Language Adversarial Examples through Probability Weighted Word Saliency - ACL Anthology&#xff0c;发表于第57届计算语言学协会年会论文集(2019年7月28日至8月2日)的第1085-1097页。 目录 论文主要工作 已有的工作 创新性 …

【论文笔记】Generating Natural Adversarial Examples

Generating Natural Adversarial Examples. Zhengli Zhao, Dheeru Dua, Sameer Singh. ICLR 2018. decision[pdf][code] 文章目录 贡献框架解释样本实验结论 贡献 框架 解释样本 举例说明&#xff08;使用算法1&#xff09; 实验 结论 要点&#xff1a; 引入 i n v e r …

【学习笔记】《Science Research Writing for Non-Native Speakers of English》Unit 1:Introduction 引言

文章目录 1.1 Structure 结构1.2 Grammar and Writing Skills 语法和写作技巧1.2.1 Tense pairs 时态对1.2.2 Signalling language 信号语言1.2.3 Passive/Active 主动 / 被动 1.3 Writing Task: Build a Model 写作任务&#xff1a;建立模型1.3.1 Building a model 建立模型1.…

惊现一篇韩语论文引用了我的博客

在google.cn搜索【"http://blog.csdn.net/pennyliang"】 找到了一个韩语论文引用了我的博客&#xff0c;很感动啊。 链接如下&#xff1a; http://www.munsam.info/?modulefile&actprocFileDownload&file_srl3315&sid62367e57f4c36ec09e2a6f1d3ca7176…

【学习笔记】《Science Research Writing for Non-Native Speakers of English》Unit 3: Results 结果

文章目录 3.1 Structure 结构3.2 Grammar and Writing Skills 语法和写作技巧3.2.1 Sequence 序列3.2.2 Frequency 频率3.2.3 Quantity 数量3.2.4 Causality 因果关系 3.3 Writing Task: Build a Model 写作任务&#xff1a;建立模型3.3.1 Building a model 构建模型3.3.2 Key …

如何去做短视频?

短视频的火爆信任咱们都是众所周知&#xff0c;不管是个人&#xff0c;仍是团队&#xff0c;都不得不在短视频上捞得一金。自己也想做&#xff0c;只可惜自己不会编排视频。短视频应该怎么制造&#xff1f;还不会编排的小伙伴就必定得好好学习了。 ​ 短视频怎么制造&#xff…

计算机图解教程视频教程,新手怎么制作短视频教程?视频处理的图文步骤

原标题&#xff1a;新手怎么制作短视频教程&#xff1f;视频处理的图文步骤 不管是任何行业的新手&#xff0c;一开始都是不懂的&#xff0c;不知道从何下手没有思路的&#xff0c;短视频制作的新手也是如此&#xff0c;他们是不知道新手怎么制作短视频的教程有哪些的。因此小编…

如何快速上手制作高质量短视频?

​很多人看到别人在视频平台上分享自己的生活和才华&#xff0c;自己也想尝试一下&#xff0c;却不知道如何快速上手制作高质量短视频。 其实制作视频并没有你想象的那么难&#xff0c;只要掌握一些必要的条件&#xff0c;努力练习即可。 一、设备选择方面 对于新手来说不建议…

短视频如何制作?教程分享,只需要四个步骤

短视频如何制作&#xff1f;教程分享&#xff0c;只需要四个步骤 现下来看&#xff0c;短视频仍旧是非常受人欢迎的&#xff0c;甚至很多品牌也都开始制作起了短视频&#xff0c;想要让更多人看到自己。而个人短视频作者也越来越多&#xff0c;有的是单纯的想要通过短视频记录…

玩转这些视频制作软件,让你成为短视频高手

新手想尝试做短视频&#xff1f;那这些软件你一定要知道&#xff0c;帮你轻松驾驭视频制作&#xff0c;高效率工作&#xff01; 视频制作工具 剪映 抖音官方剪辑工具&#xff0c;几乎能满足日常的短视频后期需要&#xff0c;同时&#xff0c;它里面还有超多的素材可供使用&am…

Thinphp集成抖音SDK

Thinphp集成抖音SDK 第一步&#xff1a;下载抖音官方SDK第二步&#xff1a;将SDK导入第三步&#xff1a;安装guzzlehttp依赖第四步&#xff1a;接口调用常见问题整理 由于抖音官方SDK相关教程太少&#xff0c; 所以本着 前人种树后人乘凉 的精神&#xff0c;写下本篇博客 第一…

抖音项目实现2: api层的实现 | 青训营笔记

目录导航&#xff1a; 1. 测试user微服务 2. api层的实现 3. github仓库地址1.测试user微服务 接上一篇实现了user微服务&#xff0c;并将服务注册到了etcd上。测试为服务业编写一个客户端发现服务并进行rpc调用&#xff0c;新建douyin/test/userRpc.go如下&#xff1a; pack…

抖音最新抓包方案

可以通过hook java层如下图所示的地方&#xff0c;dy默认走的是quick协议&#xff0c;但是为了兼容更多版本的手机&#xff0c;有一个降级操作&#xff0c;毕竟担心cronet低版本适配不好&#xff0c;所以可以通过hook这个方法来使其强制降级到Http协议。 frida脚本&#xff1a;…

从零开始搭建仿抖音短视频APP-构建后端项目

项目持续创作中... ​​​​​​仿抖音短视频APP项目专栏 目录 聚合工程 构建父工程 构建子工程 构建接口工程并且暴露api接口 优雅Restful相应封装 Lombok与多环境profile 数据层 配置数据库逆向生成工具 配置mybatis整合SpingBoot 使用Knife4j实现接口文档 聚合工程…

抖音 -抖店开放平台 SDK 实现及项目工程

抖音 - 抖店开放平台 SDK 抖音 - 抖店开放平台&#xff1a;https://op.jinritemai.com/ 该 SDK 已实现 API 接口调用和消息推送验证解析 项目地址 github&#xff1a; gitee&#xff1a; 项目结构 common-rocketmq&#xff1a; 根据 阿里 com.aliyun.openservices 的 on…

将手机接收到的短信实时转发到服务器web端上(或其他需要的地方)

在爬虫时, 有的网站要登录, 登录时需要短信验证, 因为爬虫是跑在服务端上, 所以希望服务器能实时获取到手机上的短信,使爬虫能够自动化. 为此自己开发了个能实时将安卓手机上的短信转发到服务器上. 展示如下:(将手机短信发送到服务端并储存起来,然后可以网页形式访问这些短信.…