SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub

SignalR 将整个交换信息的行为封装得非常漂亮,客户端和服务器全部都使用 JSON 来沟通,在服务器端声明的所有 hub 的信息,都会一般生成 JavaScript 输出到客户端。

它是基于浏览器的客户端和基于ASP.NET 的服务器组件 可以借助SignalR来进行双向多步对话。就是说 该对话可不受限制的进行 单个无状态请求/响应 数据交换;它将继续,直到明确关闭。  对话通过永久连接进行,允许客户端向服务器发送多个消息,并允许服务器做出相应答复。  它还允许服务器向客户端发送异步消息。

下面我们来针对Persistent Connection和Hub 做个Demo试试:

新建一个ASP.NET MVC项目MvcApplicationSignalR,通过Nuget添加SignalR的包。

新建一个类MyConnection 继承自 PersistentConnection ,引用SignalR命名空间,重写OnReceivedAsync 的方法,并要求 SignalR 对传入的信息做广播

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SignalR; 
using System.Threading.Tasks;

namespace MvcApplicationSignalR 

   public  class MyConnection : PersistentConnection


       protected override Task OnReceivedAsync(IRequest request, string connectionId, string data) 
        { 
            // Broadcast data to all clients 
            data = string.Format("数据是:{0} 时间是:{1}", data, DateTime.Now.ToString()); 
            return Connection.Send(connectionId, data); 
        }


}

接着在 Global.asax 中加入对应路由信息,这会由 SignalR 的路由表来处理 Metadata 的输出工作,红色部分代码:

protected void Application_Start() 

    RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");

这样服务器端就完成了。现在我们在项目中Master、View (Home/Index),然后加入必要的代码:

<head> 
    <meta charset="utf-8" /> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
    <script src="@Url.Content("~/Scripts/jquery-1.6.4.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.signalR-0.5.2.min.js")" type="text/javascript"></script> 
</head>

@{ 
    ViewBag.Title = "Home Page"; 

<script type="text/javascript"> 
    $(function () { 
        var connection = $.connection(‘echo‘);

connection.received(function (data) { 
            $(‘#messages‘).append(‘<li>‘ + data + ‘</li>‘); 
        });

connection.start();

$("#broadcast").click(function () { 
            connection.send($(‘#msg‘).val()); 
        }); 
        $("#btnStop").click(function () { 
            connection.stop(); 
        }); 
    });

</script> 
<h2>@ViewBag.Message</h2> 
<input type="text" id="msg" /> 
<input type="button" id="broadcast" value="发送" /> 
<input type="button" id="btnStop" value="停止" /> 
<ul id="messages"> 
</ul>

运行起来就是这个效果:

下面我们来展示 SignalR 的另一个功能:由服务器端调用客户端的 JavaScript 脚本的功能,而这个功能的要求必须是要实现成 Hub 的模式,因此我们可以顺便看到如何实现一个 Hub 类型的 SignalR 应用程序。

向项目中加入一个类Chat继承自 Hub 类 (这是 Hub 应用程序的要求) :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using SignalR.Hubs; 
using System.Threading.Tasks; 
using System.Threading;

namespace MvcApplicationSignalR 

   [HubName("geffChat")] 
   public class Chat : Hub  
   { 
       public void SendMessage(string message) 
       { 
           Clients.sendMessage(message); 
       } 
   } 
}

这段程序代码的用意是,在连接进到 Hub 时,将连接代码加到联机用户的集合中,等会就会使用到,因为我们会依照客户端的 ID 来调用客户端脚本。

1. HubName:这个 atttibute 代表 client 端要如何建立对应 server 端对象的 proxy object。通过 HubName , server 端的 class name才不会被 client 绑死。如果没有设定,则会以 server 端 class name 为 HubName 默认值。

2. 继承 Hub:继承 Hub 之后,很多对应的设计就都不用写了,我们只需要把注意力放在 client 如何送 request 给 server的 hub , server 如何通知 client 即可。

3. public void SendMessage(string message) ,就像 WebService Method 或 PageMethod 一般, client 端通过 proxy object ,可以直接调用 server 端这个方法。后续会介绍到如何在页面上使用。

4. Clients 属性:代表所有有使用 Chat 的页面。而 Clients 的型别是 dynamic ,因为要直接对应到 JavaScript 的对象。

5. Clients.sendMessage(message):代表 server 端调用 Clients 上的 sendMessage 方法,也就是 JavaScript 的方法。

6. 总结: Chat 对象职责就是当 client 端调用SendMessage() 方法后,要把这个 message ,送给所有 client 页面上呈现。以达到聊天室的功能。

服务端的做完了,开始制作客户端,同样在Home/Index页面上增加以下html代码

<%--很重要的一个参考,一定要加,且在这一行之前,一定要先参考jQuery.js与signalR.js--%> 
<script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

@{ 
    ViewBag.Title = "Home Page"; 

<script type="text/javascript"> 
    $(function () { 
        var connection = $.connection(‘/echo‘);

connection.received(function (data) { 
            $(‘#messages‘).append(‘<li>‘ + data + ‘</li>‘); 
        });

connection.start();

$("#broadcast").click(function () { 
            connection.send($(‘#msg‘).val()); 
        }); 
        $("#btnStop").click(function () { 
            connection.stop(); 
        });

  // 建立对应server端Hub class的对象,请注意geffChat的第一个字母要改成小写 
        var chat = $.connection.geffChat;

        // 定义client端的javascript function,供server端hub,通过dynamic的方式,调用所有Clients的javascript function 
        chat.sendMessage = function (message) { 
            //当server端调用sendMessage时,将server push的message数据,呈现在wholeMessage中 
            $(‘#wholeMessages‘).append(‘<li>‘ + message + ‘</li>‘); 
        };

        $("#send").click(function () { 
            //调用叫server端的Hub对象,将#message数据传给server 
            chat.sendMessage($(‘#message‘).val()); 
            $(‘#message‘).val(""); 
        });

        //把connection打开 
        $.connection.hub.start();

});

</script> 
<h2>@ViewBag.Message</h2> 
<input type="text" id="msg" /> 
<input type="button" id="broadcast" value="发送" /> 
<input type="button" id="btnStop" value="停止" /> 
<ul id="messages"> 
</ul>

<div> 
    <input type="text" id="message" /> 
    <input type="button" id="send" value="发送" /> 
    <div> 
        聊天室内容: 
        <br /> 
        <ul id="wholeMessages"> 
        </ul> 
    </div> 
</div>

1. 先引用 jQuery 与 signalR 的 js 文件。

2. 很重要的一个步骤:加入一个 js 引用,其路径为「根目录/signalr/hubs」。 SignalR 会建立相关的 JavaScript,放置于此。

3. 通过 $.connection.『server 端的 HubName』,即可建立对应该 hub 的 proxy object。要注意,首字母需小写。

4. 定义 client 端上,供 server 端通知的 JavaScript function,这边的例子是 sendMessage。

5. 当按下发送按钮时,调用 server 端的 SendMessage() 方法,只需要直接通过 proxy object 即可。要注意,首字母需小写。

6. 记得透过 $.connection.hub.start() ,把 connection 打开。

注意:SingalR 会自动生成一个siganlr/hub 的桥接js..,在本机使用localhost测试都不会有问题。当部署到IIS的时候会发生404错误,是由于被IIS误判可能是虚拟目录…,解决方法是在web.config加入一段:

<!-- 加入下面这一段-->

<system.webServer>

<validation validateIntegratedModeConfiguration="false" />

<modules runAllManagedModulesForAllRequests="true">

</modules>

</system.webServer>

这是观看别人的,我这种行为属于抄袭,但对于出学的我来说,这只是第一步

时间: 2024-11-25 17:39:07

SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub的相关文章

SignalR 实现web浏览器客户端与服务端的推送功能

SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继续,直到明确关闭. 对话通过永久连接进行,允许客户端向服务器发送多个消息,并允许服务器做出相应答复,值得注意的是,还允许服务器向客户端发送异步消息.它和AJax类似,都是基于现有的技术.本身是一个复合体.一般情况下,SignalR会使用Javascript的长轮询( long polling),实现

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating-a-wpf-chat-client-server-application/ 注意:本教程是相当广泛的,如果你是在短请也看到我们的东西 开始和 如何在几分钟内创建一个客户端服务器应用程序教程. 注2:本例中包括,明显延长进一步证明功能,在包中包含的示例 包下载. 在我们开始之前确保您已经安装了Vis

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中. (即套接字即使建立连接,输入输出流都是相对自己的而言的,向外发送自己的内部的信息都用输出流,接受外部的数据都使用输入流!) 简单服务器的代码实现: public static void main(String [] args){ try

10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。

/**10.使用TCP协议完成一个客户端一个服务器.客户端从键盘输入读取一个字符串,发送到服务器. 服务器接收客户端发送的字符串,反转之后发回客户端.客户端接收并打印. * 客户端*/ import java.io.*; import java.net.*; public class Test10_Client { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.0.

一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)

1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPoint的实现类 2.Socket对象的RemoteEndPoint. LocalEndPoint都是这个类型 3.属性Address: 使用IPv4表示的地址 4.属性Port:使用int表示的端口 2)类Socket: 这个类即可以用于作服务器端的开发,又可以作客户端的开发 构造方法: 参数 Ad

MYSQL 客户端与服务器关系

数据库概念   如果想要知道mysql数据库客户端与服务器之间的关系.首先要明白什么是"数据库". 从字面意思理解,所谓"数据库",就是存放数据的库.现实中,大家都知道仓库,粮食库,车库,快递库,它们是放各种实体东西的库.而数据库,放的只有数据. 它是一个软件,它是一个能帮我们管理数据的地方.什么样的东西算数据?一篇文章,一个人的年龄,名字,一件商品的名称,数量,价格等等...把它们放在数据库中稳妥的管理起来,且效率挺高,这就是数据库. 数据库与PHP配合的重要性

多功能集成环境在windows服务器上搭建PHP网站案例,在服务器上搭建PHP网站

服务器版本:Windows Server 2008 R2 Enterprise 平时搭建PHP网站,可以在linux服务器上搭建,也可以在windows服务器上搭建,主要看你个人需求了,今天我们演示的是用PHPWAMP绿色集成环境在windows服务器上搭建php网站. 这款PHPWAMP绿色集成环境也属于WAMP套件,大家知道什么是WAMP吧? Windows下的Apache+Mysql+PHP,称为WAMP. WAMP套件其实有很多,就比如wampserver.apmserv.xampp等等

C语言 Socket入门示例2——模拟远程CMD(客户端向服务器发送命令,服务端执行该命令)

只要把上一篇文章"C语言 Socket入门示例1"中的两段程序彻底搞懂,那么再看本文就没有任何难度了,因为仅仅是对上篇文章中服务端代码的简单修改扩充.但是简单修改过后,功能变得异常强大,犹如一个远程CMD.随着不断深入学习,功能将会变得越来越强大.欢迎大家评论指点. 1.服务端(Server): #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")

C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)

如果对Windows API不太熟悉.对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的.以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解.学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻.更遗憾的是,以前学C的时候,误以为自己把C学会了,误以为C就那么几个头文件而已,就一个黑框子而已. 现在,经过一段时间的痛苦磨练,又有了一些新的认