Signalr简单例子

Signalr简单例子

一、需要引用的

 

 

 

Js:

二、编码

用的是signalr2,需要新建Startup.cs类,编码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using  Microsoft.Owin;
using  Owin;
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
[assembly: OwinStartup( typeof (SignalrDemo.Startup))]
namespace  SignalrDemo
{   
     public  class  Startup
     {
         public  void  Configuration(IAppBuilder app)
         {
             app.MapSignalR();
 
         }
     }
}

 

后台还需要群发消息的ChatHub.cs类,编码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  Microsoft.AspNet.SignalR;
using  Microsoft.AspNet.SignalR.Hubs;
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
 
namespace  SignalrDemo.Hubs
{
     [HubName( "chatHub" )]
     public  class  ChatHub:Hub
     {
         public  void  AddToRoom( string  groupId, string  userName)
         {
             //将分组Id放到上下文中
             Groups.Add(Context.ConnectionId, groupId);
             //群发人员进入信息提示
             Clients.Group(groupId,  new  string [0]).addUserIn(groupId,userName);
         }
         public  void  Send( string  groupId, string  detail, string  userName)
         {
             //Clients.All.addSomeMessage(detail);//群发给所有
             //发给某一个组
             Clients.Group(groupId,  new  string [0]).addSomeMessage(groupId, detail,userName);
         }
     }
}

前端代码如下:

复制代码
@{
    ViewBag.Title = "Index";
    Layout = null;
}
<p>
    <span>房间号:</span>
    <input type="text" id="groupId" />
    <span>用户名:</span>
    <input type="text" id="userName" />
    <button id="joinRoom">加入聊天室</button>
</p>
<p>
    <span>消息:</span>
    <input type="text" id="message" />
    <button id="send">发送</button>
</p>
<div>
    <ul id="contentMsg">
    </ul>
</div>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.signalR-2.0.2.min.js"></script>
<script src="~/signalr/hubs"></script>
<script type="text/javascript">
    $(function () {

        var chat = $.connection.chatHub;
        chat.hubName = 'chatHub';
        chat.connection.start();
        //接收消息
        chat.client.addSomeMessage = function (groupId, detail,userName) {
            console.info("广播消息:" + detail);
            $("#contentMsg").append("<li>" + userName+": " + detail + "</li>");
        };
        //接收加入聊天室消息
        chat.client.addUserIn = function (groupId,userName) {
            $("#contentMsg").append("<li>" + userName + "进入该聊天室!</li>");
        };
        $.connection.hub.logging = true;//启动signalr状态功能

        //加入聊天室 
        $("#joinRoom").click(function () {
            var groupId = $("#groupId").val();
            var userName = $("#userName").val();
            chat.server.addToRoom(groupId,userName);
        });
        //发送消息
        $("#send").click(function () {
            var detail = $("#message").val();
            var groupId = $("#groupId").val();
            var userName = $("#userName").val();
            chat.server.send(groupId,  detail, userName);
        });

    });
</script>
复制代码

三、注意的地方。

1.在前端页面中引用了

<script src="~/signalr/hubs"></script>这个js。这是在项目中找不到,是有signalr自己生成作为桥接的js。
2.在引用过程中可能会出现一种错误。
“未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)”
此时可以尝试下载web.config中加上下面一段:

复制代码

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

B:-->
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<!--E-->

</assemblyBinding>


</runtime>

复制代码

三、与WinForm通讯。

1.引用插件:

代码:

        private void SignalRConntect()
        {
            var hub = new HubConnection(MainUrl);//与服务端对应 :app.MapSignalR();
            proxy = hub.CreateHubProxy("chatHub");//与之对应:[HubName("chatHub")]
            proxy.On<string, string, string>("addSomeMessage", (groupId, detail, userName) =>//等待接受消息 
            { Console.WriteLine("收到服务器的问候:groupId=" + groupId + ";userName=" + userName + ";detail=" + detail); });
            hub.Start().Wait();//连接开始 
            proxy.Invoke("AddToRoom", "讨论组1", "Client").Wait();//发送加入讨论组,对应方法:SignalrDemo.Hubs.AddRoom 
        }
        private void SendData(string textBox_msg)
        {
            proxy.Invoke("send","讨论组1", textBox_msg, "Client");//对应方法:SignalrDemo.Hubs.Send 
        }

SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP.NET 平台中。 它提供了一些前景极为光明的功能,而这些功能正是 .NET Framework 当前不曾具有的,并且是越来越多的开发者所需要的。 SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话。 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换;它将继续,直到明确关闭。 对话通过永久连接进行,允许客户端向服务器发送多个消息,并允许服务器做出相应答复,值得注意的是,还允许服务器向客户端发送异步消息。它和AJax类似,都是基于现有的技术。本身是一个复合体。一般情况下,SignalR会使用Javascript的长轮询( long polling),实现客户端和服务端通信。在WebSockets出现以后,SignalR也支持WebSockets通信。当然SignalR也使用了服务端的任务并行处理技术以提高服务器的扩展性。 任何一个技术的出现都是为了解决特定的问题。SignalR也不例外。我们知道网站开发中最长见到的一个功能就是在线聊天室。现在的网上的大部分在线聊天室都是基于2种技术,1.AJAX 2.Flash. 聊天室要解决最大的问题就是 消息的推送。当N个在线用户 同时加入一个聊天室时,1个用户发送消息,服务端就要把这个消息转发给特定的人。 之前的技术都是通过Javascript来不停地发送请求来轮训 服务端的新的消息。这种定期发送Ajax请求给服务器的方式,在用户很大的情况下给服务器带来很大的压力。 WebSockets这个技术的出现,很好地解决了这个问题,恰恰支持可以主动推送消息,SignalR 支持WebSockets。我们可以看到未来网络应用中会大量出现自己吃WebSockets的程序,而SignalR应该也会广泛在ASP.NET 网站中出现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值