手机版

Asp.net信号员快速启动

时间:2021-11-04 来源:互联网 编辑:宝哥软件园 浏览:

今天的主题是让大家快速了解Asp.net信号员。废话不多说,让我们正式进入今天专题的内容。

二、什么是Asp.net信号员?Asp.net信号器是微软实现实时通信的类库。一般SignalR会利用JavaScript的长轮询来实现客户端和服务器端的通信。随着Html5中WebSockets的出现,SignalR也支持WebSockets通信。此外,SignalR开发的程序并不局限于在IIS中托管,还可以在任何应用程序中托管,包括控制台、客户端程序和Windows服务等。此外,它还支持Mono,这意味着它可以跨平台部署在Linux环境中。

信号内部有两种对象:

Http Persisten Connection对象:用于解决长期连接的函数。客户端也可以主动向服务器请求数据,但是服务器不需要实现太多的细节,只需要处理PersistentConnection中提供的五个事件:on connected、on reconnected、on received、on error和OnDisconnect。Hub (Hub)对象:用于解决实时信息交换的功能。服务器可以通过网址注册一个或多个集线器。只要连接到该集线器,它就可以与所有客户端共享发送到服务器的信息。同时,服务器可以调用客户端的脚本。SignalR封装了整个信息交换,客户端和服务器端都使用JSON进行通信。服务器上声明的所有Hub信息将生成JavaScript并将其输出到客户端.NET依赖于proxy来生成Proxy对象,而Proxy在内部将JSON转换为对象。

客户端和服务器之间的具体交互如下图所示:

从上面的介绍可以看出,既然SignalR是为实时而生的,那就决定了它的使用场所。具体适用场景如下:

1.聊天室,如在线客服系统、IM系统等。2.实时更新股价3。消息推送服务4。游戏中角色位置的实时推送目前,我公司正在开发一个在线客服系统。

3.使用Asp.net信号员在网上广播信息。通过第二部分的介绍,相信大家对Asp.net通信兵有了一个初步的了解。然后,给出两个例子,帮助大家加深对信号员工作机制的理解。第一个例子是如何使用SignalR在Web端广播消息。

使用Visual Studio 2013,创建一个MVC项目,通过Nuget安装SignalR包。右键单击->选择管理Nuget包->并在出现的窗口中输入Signar,以找到要安装的Signar包。成功安装信号程序后,信号程序库的脚本将被添加到脚本文件夹中。如下图所示:

向项目中添加一个信号集线器(v2),并将其命名为服务器集线器。

5.将以下代码填充到刚刚创建的ServerHub类中。

使用微软。信号员;使用微软。信号中枢;使用系统;命名空间信号检查开始公共类服务器集线器:集线器{私有静态只读char[]常量={ '0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' A ',' B ',' C ',' D ',' F ',' G ',' H ',' I ',' J ',' K ',' L ',' M ',' N ',' O ',' P ',' Q ',' R ',' S ',' T ',' V ',' W ',' X ','摘要///供客户端调用的服务器端代码////summary///param name=' message '/param public void Send(字符串消息){ var name=GenerateRandomName(4);//调用所有客户端的发送消息方法客户全部.发送消息(名称,消息);} ///摘要///产生随机用户名函数////summary///param name=' length '用户名长度/param /返回/返回公共静态字符串生成器名称(整数长度){ var new random=新系统.文字。StringBuilder(62);var rd=new Random();for(var I=0;一、长度;i ) { newRandom .追加(常量[rd .下一个(62)];}返回纽兰登.ToString();} }}6.创建一个启动类,如果开始创建手动音量调节项目的时候没有更改身份验证的话,这个类会默认添加的,如果已有就不需要重复添加了。按照如下代码更新启动类。

7.在主页控制器中创建一个家庭行动方法

公共类HomeController :控制器{公共操作结果索引(){返回视图();}公共行动结果关于(){ viewpag .消息='您的应用程序描述页;返回视图();}公共行动结果联系人(){ viewpag .消息='您的联系页面;返回视图();}公共操作结果聊天(){返回视图();} }8.在视图文件中主页文件夹中创建一个闲谈视图,视图代码如下所示:

@{ ViewBag .Title='聊天窗口;}h2Chat/h2div class='container '输入类型='text' id='message' /输入类型='button' id='sendmessage '值='发送'/输入类型=' hidden ' id=' display name '/ul id=' discussion '/ul/div @ section scripts {!-引用信号员库. script-src=' http : ~/Scripts/jquery。二号先生。2 .0 .量滴js '/脚本!-引用自动生成的信号员集线器(集线器)脚本。在运行的时候在浏览器的来源下可看到-script src=' http : ~/signor/hubs '/script script $(function(){//引用自动生成的集线器代理var chat=$。连接。serverhub//定义服务器端调用的客户端发送消息来显示新消息chat.client.sendMessage=函数(名称,消息){ //向页面添加消息$(' #讨论').追加(“listrong”HTMlencode(name)'/strong :“HTMlencode(message)'/Li ');};//设置焦点到输入框$('#message ').焦点();//开始连接服务器$.connection.hub.start().done(function(){ $(' # send message ')).单击(函数(){ //调用服务器端集线器的发送方法chat . server . send($(“# message”).val());//清空输入框信息并获取焦点$('#message ').val(" ")。焦点();});});});//为显示的消息进行超文本标记语言编码函数htmlEncode(value){ var encodedValue=$(' div/').文本(值)。html();返回编码值;} /script }9 .修改应用程序_开始文件夹内的路由配置类,将行动方法默认设置为聊天。

公共类路由图{公共静态无效注册路由(路由选择路由){路由。忽略重路由(' {resource})。axd/{ * PathInfo } ');路线。MapRoute(name: 'Default ',URL :“{ controller }/{ action }/{ id }”,Default s 3360 new { controller=' Home ',action='Chat ',id=UrlParameter。可选});}}至此,我们的示例已经完成。接下来,让我们先看看运行效果,然后解释SignalR是如何完成消息广播的。的运行结果如下。

从运行结果中,您可以发现,如果您在任何窗口中输入和发送信息,所有客户端都将收到该消息。这样的效果在实际应用中有很多,比如QQ,登录QQ时会推送腾讯广告消息。

阅读运行结果后,让我们分析代码,然后分析SignalR是如何工作的。

按照B/S模式,运行程序时,网页与SignalR服务建立连接,建立连接的具体代码为$.connection.hub.start()。此代码的功能是建立与SignalR服务的连接,稍后完成的功能表示在成功建立连接后,发送按钮注册了Click事件。当客户端输入内容并点击发送按钮时,将触发点击事件,触发的操作为chat.server.send ($ ('# message ')。val())。这段代码意味着调用服务器的send函数,而服务器的Send朝鲜语版本调用所有客户端的sendMessage函数,而客户端中的sendMessage函数将信息添加到相应的消息列表中。这样就实现了广播消息的功能。

看到这一点,有人怀疑前面的实现只使用hub对象,而不使用持久连接对象吗?实际上,情况并非如此。$的代码。连接是使用持久连接对象。当然,您也可以在OnConnected方法中检查监控客户端的连接状态。更新后的代码如下:

公共类ServerHub : Hub { private static readonly char[]Constant={ ' 0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' A ',' B ',' C ',' D ',' E ',' F ',' G ',' J ',' K ',' L ',' M ',' N ',' O ',' Q ',' R ',' S ',' T ',' U ',' V ',' W ',' X ',' Y ',' Z ',' A ',' B ',' C ',' D ',///summary////客户端调用的服务器端代码/////summary//param name=' message '/param public void send(字符串消息){ var name=generaterandomname(4);//调用所有客户端的sendMessage方法clients.all.sendmessage(名称、消息);}///summary////call////summary//returns/returns common override task on connected(){ trace . writeline('客户端连接成功');返回基地。OnConnected();}///summary////生成随机用户名函数////summary///param name=' length '用户名length/param///返回/返回public static string generaterandomname(int length)。{ var newRandom=新系统。text . StringBuilder(62);var rd=new Random();for(var I=0;一、长度;i ) { newRandom。追加(常量[rd。下一个(62)];}返回newRandom。ToString();}}这样,在运行页面时,就会在输出窗口看到“客户端连接成功”的字样。运行效果如下图所示:

在第二部分的介绍中,说到服务器上声明的所有Hub信息都会生成JavaScript并输出到客户端。要验证这一点,可以在Chrome中查看F12中的源代码,如下图所示:

看到上面的图片,你就能理解为什么Chat.cshtml页面需要引入‘signor/hubs’脚本库了。

!-引用信号员库. script-src=' http : ~/Scripts/jquery。二号先生。2 .0 .量滴js '/脚本!-引用自动生成的信号员集线器(集线器)脚本。在运行的时候在浏览器的来源下可看到-脚本src=' http : ~/signor/hubs '/脚本四、在桌面程序中如何使用Asp.net信号员上面部分介绍了信号员在Asp.net最有价值球员中的实现,这部分将通过一个例子来看看信号员在数据绑定或程序是如何使用的。其实这部分实现和Asp.net最有价值球员中非常相似,主要不同在于,Asp.net MVC中的信号员服务器寄宿在(同移民检查员移民检查)中,而在数据绑定中应用,我们把信号员寄宿在数据绑定客户端中。

下面让我们看看信号员服务端的实现。

///摘要///启动信号员服务,将信号员服务寄宿在数据绑定程序中////summary private void StartServer(){ try { signor=WebApp .start(Serveruri);//启动信号员服务} catch(TargetinvocationException){ Writetontosole('一个服务已经运行在:' Serveruri);//调度员回调来设置用户界面控件状态这个。调度程序。调用(()=按钮启动等熵d=真);返回;}这个。调度程序。调用(()=按钮停止等熵d=真);WriteToConsole(')服务已经成功启动,地址为:' Serveruri);}公共类ChatHub : Hub {公共作废发送(字符串名称,字符串消息){客户.All.addMessage(名称,消息);}公共覆盖任务OnConnected() { //应用程序。当前。调度程序。调用(()=((主窗口)应用程序。当前主窗口)。WriteToConsole(')客户端连接,连接身份是: '上下文ConnectionId));返回基地OnConnected();}公共覆盖任务已连接(bool StOpcalled){ 0应用程序。当前。调度程序。调用(()=((主窗口)应用程序。当前主窗口)。WriteToConsole(')客户端断开连接,连接身份是: '上下文ConnectionId));返回基地OnDisconnected(真);} }公共类启动{公共void Configuration(IAppBuilder应用){//有关如何配置应用程序的详细信息,请访问http://go.microsoft.com/fwlink/?LinkID=316888/允许克-奥二氏分级量表跨域//app .用户界面.允许穿墙);应用程序.mapsignor();} } 通过上面的代码,我们信号员服务端的实现就完成了,其实现逻辑与Asp.net最有价值球员的代码类似。

接下来,让我们看看,WPF客户端是如何连接和与服务器进行通信的。具体客户端的实现如下:

public IHubProxy HubProxy { get设置;} const string ServerURi=' http://localhost :8888/signal r ';公共HubConnection Connection { get设置;} public main window(){ InitializeComponent();//窗口启动时开始连接服务ConnectAsync();}///summary////send message///summary//param name=' sender '/param///param name=' e '/param private void button end _ click(对象sender,RoutedEventArgs e) {//通过代理调用服务器的Send方法//然后服务器的Send方法调用客户端的AddMessage方法将消息输出到hubproxy.invoke(消息框中的'(Send ',generaterandomname (4),textbox message . text . trim());文本框消息。文本=字符串。空的;文本框消息。焦点();} private async void ConnectAsync(){ Connection=new HubConnection(Serveruri);连接。关闭=连接_关闭;//创建hub proxy对象hub proxy=connection . createhub proxy(' chat hub ');//被服务器调用以将消息输出到hubproxy.onstring,string ('addmessage ',(name,message)=this . dispatcher . invoke(()=richtextbox console . append text(string . format(' { 0 } : { 1 } \ r ',name))。尝试{等待连接。start();} catch(http request exception){//连接失败返回;}//显示聊天控件chat panel . visibility=visibility . visibility;按钮发送。IsEnabled=true文本框消息。焦点();RichTextBoxConsole。AppendText('连接到服务:' ServerURi ' \ r ');}以上代码是WPF客户端实现的核心代码,主要逻辑是客户端启动时调用Connection。启动方法来连接服务器。然后通过HubProxy代理类调用hub中Send方法,hub中的Send方法通过调用客户端的addMessage方法将消息输出到客户端的消息框中进行显示,从而完成消息推送过程。接下来,我们来看看它的操作效果:

从上面的运行效果可以看出,它的效果和对Asp.net MVC一样。

5.总结到这里,这个话题的所有内容都结束了。这个信号员的快速介绍也是我在学习信号员过程中的体会。希望能帮助一些刚接触Signaler的朋友快速上手。本文主要实现信号员播报消息的功能,并能实现手机推送消息的功能。下一篇文章将介绍如何使用Signaler实现一对一聊天。

版权声明:Asp.net信号员快速启动是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。