第三章SignalR在线聊天例子
第三章SignalR在线聊天例子
本教程展示了如何使用SignalR2.0构建一个基于浏览器的聊天室程序。你将把SignalR库添加到一个空的Asp.Net Web应用程序中,创建用于发送消息到客户端的集线器(Hubs)类,创建一个Html页面让用户在该页面上发送和接收聊天信息。对于如何在MVC5环境中创建这个聊天室程序,请参阅Getting Started with SignalR 2.0 and MVC 5。
SignalR是一个开源的.Net库,用于构建需要实时用户交互或实时数据更新的Web应用程序。比如社交网站应用、多用户在线游戏、商务协作、新闻、天气、金融或更新应用的程序。以上通常被称为----实时应用程序。
SignalR简化构建实时应用程序的过程。它包含一个Asp.net服务器库和一个JavaScript客户端库,使其更容易管理客户端到服务器端的连接并推送内容到客户端让其更新。您可以将SignalR库添加到现有的Asp.net应用程序已实现实时功能。
本教程将演示SignalR是如何开发的:
1) 添加Signal库到Asp.net Web 应用程序。
2) 建立一个集线器(Hubs)类来推送更新内容到客户端。
3) 建立一个.Net开放Web 接口(OWIN)启动类来配置应用程序
4) 杂网页中使用SignalR jQuery库发送和显示更新消息
下面的屏幕截图显示了在浏览器运行中的聊天应用程序,每个新加入聊天室的用户都可以随意发言。

1.设置项目:
本节说明如何使用VS2013及SignalR2.0库来创建一个空的Asp.Net Web应用程序,并向其添加SignalR,使它实现实时聊天室的功能。
1) 在VS2013中创建一个新的Web应用程序。

2) 在新的Asp.Net项目窗口中,选择空项目并且确定创建

3) 在解决方案资源管理器中,右击项目,选择添加----新建项,选择SignalR集线器类(v2),命名为ChatHus.cs并添加,如下图:

这一步将创建ChatHub类,并将一组SignalR脚本和程序集引用添加到项目中。
注意:您还可以通过NuGet来添加SignalR到项目中,通过打开工具----库软件包管理器----包管理器控制台,并运行一个明命令:install – package Microsoft.AspNet.SignalR
如果您使用包管理器控制台来添加SignalR,请在添加后再执行创建ChatHub类这一步。
4) 在解决方案资源管理器中,展开脚本文件夹,可以看到项目已经添加jQuery已经SignalR的JS引用。

5)编辑你的ChatHub文件,删除Hello方法并且添加Send方法,如下面代码:
|
using System; using System.Web; using Microsoft.AspNet.SignalR; namespace SignalRChat { public class ChatHub : Hub { public void Send(string name, string message) { // Call the broadcastMessage method to update clients. Clients.All.broadcastMessage(name, message); } } } |
6)在解决方案资源管理器中,右击项目,然后添加----新建项----OWIN启动类,将类命名为Startup并添加。

7)在启动类的配置方法中添加SignalR的映射,如下面的代码:
|
using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息, // 请访问http://go.microsoft.com/fwlink/?LinkID=316888 app.MapSignalR(); } } } |
8)在解决方案资源管理器中,右键单击该项目,然后点击添加----新建项----HTML页面,命名为index.html并添加。

9)用下面的代码替换掉Html的:
|
<!DOCTYPE html> <html> <head> <title>SignalR Simple Chat</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 references. --> <!--Reference the jQuery library. --> <script src="Scripts/jquery-1.6.4.min.js" ></script> <!--Reference the SignalR library. --> <script src="Scripts/jquery.signalR-2.0.2.min.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="signalr/hubs"></script> <!--Add script to update the page and send messages.--> <script type="text/javascript"> $(function () { // Declare a proxy to reference the hub. var chat = $.connection.chatHub; // Create a function that the hub can call to broadcast messages. chat.client.broadcastMessage = function (name, message) { // Html encode display name and message. var encodedName = $('<div />').text(name).html(); var encodedMsg = $('<div />').text(message).html(); // Add the message to the page. $('#discussion').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { |
|
$('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); }); </script> </body> </html> |
注意:如果你使用包管理器来安装了SignalR,请核对脚本目录中的SignalR脚本文件名与上面Html代码中所引用的是否一致,如下图:

11)保存全部项
2.运行示例:
1)按下F5,在调试模式下运行该项目,如果一切正常,Html会在浏览器中打开并提示一个对话框。

2)输入用户名并确定。
3)复制这个浏览器中的URL,打开一个新的浏览器实例,在另外一个浏览器中,输入一个新用户名。
4)在每个浏览器实例中添加评论并且发送,评论将被发送到所有浏览器的页面中。
注意:这个简单的聊天室没有在服务器上维护一个聊天上下文(旧的数据),所有发送的评论将实时广播给打开了页面的所有浏览器,所以新加入的用户无法看到以前的历史记录。

5)在解决方案资源管理器中,检查正在运行的应用程序的脚本文件,您可以看到SignalR库动态生成Hub脚本文件,该文件管理jQuery脚本和服务器代码之间的通讯。

3.回顾:
SignalR聊天室程序演示了两个最基本的Signal开发任务:
A:在服务器端创建一个集线器作为主要协调对象;
B:使用SignalR和jQuery来发送和接受评论;
1)SignalR集线器(Hub):
在代码示例中的ChatHub类派生自Microsoft.AspNet.SignalR.Hub类。是最通常的建立SignalR应用程序的方法------从Hub类派生。你可以创建你的集线器类的公共方法,然后从网页中的脚本调用他们来访问这些方法。
在本示例中,客户端调用ChatHub.Send来发送新评论。反之,集线器通过调用Clients.All.broadcastMessage来将新评论发送至所有客户端。
Send方法演示了使用集线器的概念:
a) 在集线器上建立公共方法,使客户端可以调用它们。
b) 使用Microsoft.AspNet.SignalR.Hub.Clients动态属性访问连接到该集线器的所有客户 端。
c) 调用客户端方法(比如:broadcastMessage函数)来更新客户端。

2)SignalR和jQuery
Html页面暂时了如何使用SignalR和jQuery库与SignalR集线器通讯,即定义了一个代理引用集线器,声明一个函数可以让服务器推送内容到客户端,并且可以实时连接,已发送消息到集线器上。
下面的代码定义了一个集线器代理的引用:
|
var chat = $.connection.chatHub; |
注意:在JS中,引用服务器类以及成员,应当使用驼峰(camel)式拼写。该代码实例使用chatHub引用了服务器端的ChatHub类。
下面代码演示了如何创建一个回调函数,服务器上的集线器类调用这个函数来推送内容,并且更新到每个客户端。前两行代码表示将输入的内容进行Html编码,作为一个简单的防止脚本注入的方法:
|
chat.client.broadcastMessage = function (name, message) { // Html encode display name and message. var encodedName = $('<div />').text(name).html(); var encodedMsg = $('<div />').text(message).html(); // Add the message to the page. $('#discussion').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; |
下面的代码显示了如何打开与集线器的连接。该代码启动连接,然后传递一个函数来处理Html页面上发送按钮的点击事件。
|
$.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); |
注意:此方法可确保SignalR在事件句柄处理之前就建立好通讯连接.
4.下一步
您已经了解到SignalR框架是如何构建起一个实时Web应用程序的,您还了解并演练了几个开发任务:添加SignalR库到Web应用程序中,创建一个集线器类及如何从集线器发送、接收消息。要了解更多,请参阅以下连接:
第三章SignalR在线聊天例子的更多相关文章
- 三、jQuery--jQuery基础--jQuery基础课程--第12章 jQuery在线聊天室
在线聊天室案例 一.功能简介: 1.用户需要登录后才能进入聊天室交流 2.已无刷新的方式,动态展示交流后的内容和在线人员的基本信息 3.登录后的用户可以提交文字和表情图标 技术重点:利用ajax的无刷 ...
- [Asp.net 开发系列之SignalR篇]专题三:使用SignalR实现聊天室的功能
一.引言 在前一篇文章中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然 ...
- SignalR实现在线聊天室功能
一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
- java Socket实现简单在线聊天(三)
在上一篇,利用线程使服务端实现了能够接收多客户端请求的功能,这里便需要客户端接收多客户端消息的同时还能把消息转发到每个连接的客户端,并且客户端要能在内容显示区域显示出来,从而实现简单的在线群聊. 在实 ...
- 三分钟搭建websocket实时在线聊天,项目经理也不敢这么写
我们先看一下下面这张图: 可以看到这是一个简易的聊天室,两个窗口的消息是实时发送与接收的,这个主要就是用我们今天要讲的websocket实现的. websocket是什么? websocket是一种网 ...
- 第四章SignalR自托管主机
第四章SignalR自托管主机 SignalR服务器通常在IIS的Asp.Net应用程序上承载,但它也可以使用自托管库来作为自托管的主机来运行(就像控制台应用程序或Windows服务那样)与Signa ...
- 精通Web Analytics 2.0 (5) 第三章:点击流分析的奇妙世界:指标
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第三章:点击流分析的奇妙世界:指标 新的Web Analytics 2.0心态:搞定它.新的闪亮系列工具:是的.准备好了吗?当然 ...
- 在线聊天室的实现(1)--websocket协议和javascript版的api
前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...
随机推荐
- POJ 1811 Prime Test 素性测试 分解素因子
题意: 给你一个数n(n <= 2^54),判断n是不是素数,如果是输出Prime,否则输出n最小的素因子 解题思路: 自然数素性测试可以看看Matrix67的 素数与素性测试 素因子分解利用 ...
- bash 学习笔记(一)
尽量使用printf而不要用echo(echo再不同情况下语义不同) 整数%d,小数后6位%f,科学计数法 %e,16进制 %x 宽度限制 %8s %-15s 正数朝右对齐 负数朝左对齐:%04d\n ...
- Walking Ant(一道有意思的蚂蚁游戏,bfs)
Walking Ant Time Limit: 2 Seconds Memory Limit: 65536 KB Ants are quite diligent. They sometime ...
- 菜鸟必须知道的linux的文件目录结构
Linux文件目录结 / 根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin bin就是二进制(binary)英文缩写.在一般的系统当中,你都可 ...
- LSH算法原理
原始链接--http://www.jiahenglu.net/NSFC/LSH.html LSH(Location Sensitive Hash),即位置敏感哈希函数.与一般哈希函数不同的是位置敏感性 ...
- 手工删除oracle的方法
大致方法如下: 1.删除物理文件 1.1.oracle安装文件. 1.2.系统目录下,program files文件下的oracle文件 2.注册表中大概有这么几个地方: hkey ...
- HDoj-2072-字数
字数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- Shell命令行
利用wc命令统计文件行,单词数,字符数,利用sort排序和去重,再结合uniq可以进行词频统计. cat file.txt sort hello.c | uniq -c | sort -nr |hea ...
- springmvc 传递和接收数组参数
java url中如何传递数组,springMVC框架controller类如何接收数组参数? 下面介绍一下URL中传递数组参数方法: dd.do?titles[]=col1&titles[] ...
- juce中的timer
juce中timer总体说还是比较好用的,使用时只需继承timer类, 重写callback然后调用start就可以了,juce的timer比较特别,自己通过线程实现,starttimer的时候会创建 ...