• 技术文章 >web前端 >js教程

    Vue结合SignalR前后端实时消息同步实现方法

    小云云小云云2018-02-05 16:15:42原创1457
    本文主要为大家介绍Vue结合SignalR实现前后端实时消息同步,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。

    最近业务中需要实现服务器端与客户端的实时通信功能,对Signalr做了一点总结和整理。

    SignalR 作为 ASP.NET 的一个库,能够简单方便地为应用提供实时的服务器端与客户端双向通信功能。

    SignalR 在客户端方面有两种API:Connections 和 Hubs。

    在特殊情况下,比如发送消息的格式是特定不变时,使用Connections API。

    大多数情况下使用Hubs,因为它是 Connections API 更高级的一种实现,允许客户端与服务端相互直接调用方法。一个实际应用的具体场景,比如服务端获取到新订单时,调用客户端的打印方法,客户端打印完成后,调用服务端的订单状态更新方法。

    下面介绍 Hubs 在前端的 API

    generated proxy

    当使用generated proxy的时候,在语法层面上可以更加简单地调用服务端方法,就像在服务端直接调用。

    如下面是服务端的代码,表示新增一条聊天信息到列表


    public class DemoChatHub : Hub
    {
      public void NewChatMessage(string name, string message)
      {
        Clients.All.addMessageToList(name, message);
      }
    }

    客户端调用的时候:


    var demoChatHubProxy = $.connection.DemoChatHub;
    demoChatHubProxy.client.addMessageToList = function (name, message) {
      console.log(name + ' ' + message);
    };
    $.connection.hub.start().done(function () {
     
      $('#newChatMessage').click(function () {
         demoChatHubProxy.server.newChatMessage($('#displayname').val(), $('#message').val());
       });
    });

    不使用 generated proxy 时,客户端调用的时候则是


    var connection = $.hubConnection();
    var demoChatHubProxy = connection.createHubProxy('demoChatHub');
    demoChatHubProxy.on('addMessageToList', function(name, message) {
      console.log(name + ' ' + message);
    });
    connection.start().done(function() {
      $('#newChatMessage').click(function () {
        demoChatHubProxy.invoke('newChatMessage', $('#displayname').val(), $('#message').val());
        });
    });

    但是在Vue项目里面,如果前后端分离,不会这样引用:


    <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

    而且在客户端方法中如果要使用多个事件处理器时,不能使用generated proxy。

    因此后面的例子不采取generated proxy的方式。

    1.如何建立连接


    var connection = $.hubConnection('localhost:23123');//如果前后端为同一个端口,可不填参数。如果前后端分离,这里参数为服务器端的URL
    var demoChatHubProxy = connection.createHubProxy('demoChatHub');
    demoChatHubProxy.on('addMessageToList', function(userName, message) {
      console.log(userName + ' ' + message);
    }); 
    connection.start()
      .done(function(){ console.log('Now connected, connection ID=' + connection.id); })
      .fail(function(){ console.log('Could not connect'); });

    需要注意的是,开始连接之前(调用 start 方法之前),最好注册至少一个事件处理方法,如果没有注册的话,Hubs的 OnConnected 方法将不会被调用,那么客户端的方法就不能被服务端调用(这容易埋坑,所以要提前注册方法)。

    2.客户端如何调用服务器端方法
    使用 invoke,注意调用服务器端的方法名首字母可以不大写,如果方法名称要限制必须大写,需要后端做配置。


    demoChatHubProxy.invoke('newChatMessage', {name:'a',message:'b'});

    3. 服务器端调用客户端方法

    首先客户端要注册方法才能让服务器端调用,使用 on 方法注册。


    demoChatHubProxy.on('addMessageToList', function(userName, message) {
      console.log(userName + ' ' + message);
    });

    4 在Vue项目中使用SignalR

    首先安装 SignalR 的package,需要注意的是 SignalR 依赖 jQuery。

    npm i signalr,jquery

    为了方便,在webpack.base.conf.js中注册全局的jQuery


    plugins: [new webpack.ProvidePlugin({
          $: 'jquery',
          jQuery: 'jquery',
          'window.jQuery': 'jquery',
          'root.jQuery': 'jquery'
        })
      ]

    然后在main.js中引入 SignalR

    import 'signalr'

    这时候就可以在Vue项目中使用SignalR了,后端的相关配置暂时略过。

    新建一个signalr.js


    import { Message } from 'element-ui';
    const HUBNAME = 'DefaultHub';
    
    /*客户端调用服务器端方法*/
    //更新订单打印次数
    const updateOrderPrint = {
      name:'updateOrderPrint',
      method:function(data){
        console.log(data)
      }
    }
    
    /*服务器调用客户端方法*/
    // 打印新订单
    const printNewOrder = {
      name:'printNewOrder',
      method:function(data){
        console.log(data)
      }
    }
    const get = {
      name:'Get',
      method:function(data){
        console.log(data)
      }
    }
    
    //服务器端的方法
    const serverMethodSets = [updateOrderPrint];
    //客户端的方法
    const clientMethodSets = [printNewOrder,get]; //将需要注册的方法放进集合
    
    // 建立连接
    export function startConnection() {
      let hub = $.hubConnection(process.env.HUB_API)
      let proxy = createHubProxy(hub) //需要先注册方法再连接
      hub.start().done((connection) =>{
        console.log('Now connected, connection ID=' + connection.id)
      }).fail(()=>{
        Message('连接失败' + error);
        console.log('Could not connect');
      })
      hub.error(function (error) {
        Message('SignalR error: ' + error);
        console.log('SignalR error: ' + error)
      })
      hub.connectionSlow(function () {
        console.log('We are currently experiencing difficulties with the connection.')
      });
      hub.disconnected(function () {
        console.log('disconnected')
      });
      return proxy
    }
    // 手动创建proxy
    export function createHubProxy(hub){
      let proxy = hub.createHubProxy(HUBNAME)
      // 注册客户端方法
      clientMethodSets.map((item)=>{
        proxy.on(item.name,item.method)
      })
      return proxy
    }

    这样,在组件引入signalr.js后调用startConnection方法即可建立连接。

    相关推荐:

    python基于itchat实现微信群消息同步机器人

    以上就是Vue结合SignalR前后端实时消息同步实现方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:SignalR 消息 实时
    上一篇:javascript实现全屏滚动功能 下一篇:JavaScript原生态兼容IE6可调控滚动文字功能
    PHP编程就业班

    相关文章推荐

    • 一文聊聊算法的时间复杂度和空间复杂度• 聊聊Angular 依赖注入体系中的基本概念• 什么是流?深入了解Node.js中的可读流• javascript技巧之拆箱装箱和类型转换• 看看这些jQuery常见面试题,帮助你更好理解基础知识!

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网