zoukankan      html  css  js  c++  java
  • ASP.NET SignalR 系列(三)之代码实现

     说在前头:

    因SignalR默认采用camel的编码规范,故前端调用后端的对象或者方法时,首字母均需要小写

    创建集线器

     

    创建完,文件中默认创建了一个不带参数Hello方法的示例,我们修改一下,带个参数。这个参数就是接收我们要发送的内容

    /// <summary>
    /// 示例,参数可以多个
    /// </summary>
    /// <param name="content">广播的内容</param>
    public void Hello(string content)
    {
       Clients.All.show(content);
    }

     在Startup.cs文件中注册集线器

    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartupAttribute(typeof(SignalRDemo.Startup))]
    namespace SignalRDemo
    {
        public partial class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.MapSignalR(); //声明注册集线器映射
            }
        }
    }

    这样,服务端的准备工作就已经完成了。接下来是前端

    新建一个index.html文件,引用如下脚本

    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <script src="Scripts/jquery.signalR-2.3.0.min.js"></script>
    <script src="~/signalr/hubs"></script>

    脚本的引用顺序必须按上面的顺序来

    第三个,hubs为虚拟的脚本地址,固定写法。这个脚本会在页面浏览时自动生成js内容。不可删除。

    编写页面布局

    <div>
        <input type="text" id="content" placeholder="发送内容" class="input"/> &nbsp;&nbsp;<input type="button" value="发送" class="btn btn-sm btn-info"/>
        <div>
            <h4>接收到的信息:</h4>
            <ul id="dataContainer">
            
            </ul>
        </div>
    </div>

    接下来,重点了,就是前端js的编写,连接服务端集线器,直接上代码

    <script language="javascript">
        $(function() {
            var chat = $.connection.demoHub; //连接服务端集线器,demoHub为服务端集线器名称,js上首字母须改为小写(系统默认)
            //定义客户端方法,此客户端方法必须与服务端集线器中的方法名称、参数均一致。
            //实际上是服务端调用了前端的js方法(订阅)
    //若多个参数,服务端也需要一致
    chat.client.show=function(content) { var html = '<li>' + htmlEncode(content) + "</li>"; $("#dataContainer").append(html); } //定义推送 $.connection.hub.start() .done(function() { $("#btn_send").click(function() { chat.server.hello($("#content").val()); //将客户端的content内容发送到服务端 $("#content").val(""); }); }); }); //编码 function htmlEncode(value) { var encodedValue = $('<div />').text(value).html(); return encodedValue; } </script>

     演示:

    选择一个页面后,发送内容,两个页面同时订阅到

    下面说说原理:

    当我点击发送时,执行了前端定义的click事件,即下面的方法

     $("#btn_send").click(function() {
                        chat.server.hello($("#content").val());  //将客户端的content内容发送到服务端
                        $("#content").val("");
                    });

    1、通过 chat.server对象,调用服务端定义的Hello方法,此时,你发现首字母大小写不同(原因见最上面红色字体)。
    2、服务端的Hello方法接收到推送的content内容时,执行了 Clients.All.show(content)方法。该方法通过Clients对象,向所有的连接的前端请求执行了show方法,并且将content内容传递到前端。后面会讲述服务端Clients对象

    3、前端的show方法接收到服务端发送过来的content内容,执行了前端对应的方法进行html渲染。

    这样3个步骤,完成整个 前端--服务端---所有订阅的前端 的过程

    需要注意的几个点:

    1、前端调用后端的对象和方法的首字母大小写问题

    2、后端调用前端的js方法时,大小写与前端js定义的保持一致,名称一致。

    3、定义推送是,start表示开启集线器连接,这个必须要有。done是指从前端做推送。当然也可以是从其他服务端推送,后面会讲到。

    4、客户端的参数个数可自定义

    本章结束!



  • 相关阅读:
    mysqladmin
    Android project structure in Eclipse
    Android System Architecture
    The Origins of Data Mining
    Ubuntu 12.04 ‘can not lock /etc/shadow try again later’
    20122013QS计算机专业世界大学排名
    What is Data Mining
    HOW to login MYSQL, Help, and Select Database
    C++函数指针与C#委托之间有何联系
    How to download codes from Google Code
  • 原文地址:https://www.cnblogs.com/fei686868/p/9561598.html
Copyright © 2011-2022 走看看