文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

signalR+redis分布式聊天服务器是如何搭建

2023-06-17 04:40

关注

signalR+redis分布式聊天服务器是如何搭建,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

最近在搞一个直播项目需要聊天服务器,之前是以小打小闹来做的,并没有想太多就只有一台服务器。前几天一下子突然来了5000人,服务器瞬间gg,作为开发人员的我很尴尬! 这就是我们这篇文章的背景。

  我使用的是C# Mvc4.0 来开发的,这里还需要一个redis 至于你是windows版本还是Linux版本我就不管了,反正是要有个地址一个端口,密码根据实际情况填写。

  我这里用一个demo来展现分布式的情况https://git.oschina.net/908Sharp/signalR-multi-Server.git

  第一步:新建两mvc项目

  从nuget 中添加以下几个包

Install-Package Microsoft.AspNet.SignalR

Install-Package Microsoft.AspNet.SignalR.Redis

install-package Microsoft.Owin.Cors

  第二步:在App_Start目录中添加Owin StartUp类

signalR+redis分布式聊天服务器是如何搭建

  public void Configuration(IAppBuilder app)
        {
            GlobalHost.DependencyResolver.UseRedis("127.0.0.1", 6379, string.Empty, "SignalRBus");
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);

              var hubConfiguration = new HubConfiguration
                {
                    EnableJSONP = true
                };
                map.RunSignalR(hubConfiguration);
            });
        }

注意引用的包啊,骚年们。

  第三步:添加ChatHub 类

signalR+redis分布式聊天服务器是如何搭建

  [HubName("chat")]
    public class ChatHub:Hub
    { 
        public void Chat(string msg)
        {
            Clients.All.Display("Receive Msg:" + msg);
        }

}

后端就算完成了。

  第四步:前端页面的创建

signalR+redis分布式聊天服务器是如何搭建

<div id="chat-content"></div>
<input type="text" id="msg" name="name" value="" placeholder="请输入聊天内容"/>
<input type="button" id="btn" name="name" value="发送" />
<script src="/Scripts/jquery-1.10.2.min.js"></script>
<script src="/Scripts/jquery.signalR-2.2.1.js"></script>
<script src="/Scripts/hub.js"></script>

<script>
   
    conn = $.hubConnection();
    conn.qs = {
    };
    conn.start().done(function () {
        console.log('signalr  success');
        $('#btn').click(function () {
            var msg = $('#msg').val();
            chat.invoke("Chat", msg)
                .done(function () {
                    console.log('signalr send success');
                    $('#msg').val('');
                })
                .fail(function (e) {
                    console.log('signalr send fail');
                });
        })
    });
    chat = conn.createHubProxy("chat");
    chat.on("Display", function (msg) {
        $('#chat-content').html($('#chat-content').html() + '<br/>' + msg)
    });
</script>

记住我上面说的demo是两个站哦,代码都一样的,正式环境的时候我们肯定是一份代码在不同服务器上部署,指向同一个redis地址

***我说一下<script src="/Scripts/hub.js"></script> 这个东西是自动生成的,你也可以手动指定,我还是把代码贴出来吧。你也可以F12自己去看。

/// <reference path="..\..\SignalR.Client.JS\Scripts\jquery-1.6.4.js" />
/// <reference path="jquery.signalR.js" />
(function ($, window, undefined) {
    /// <param name="$" type="jQuery" />
    "use strict";

  if (typeof ($.signalR) !== "function") {
        throw new  Error("SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js  is referenced before ~/signalr/js.");
    }

  var signalR = $.signalR;

  function makeProxyCallback(hub, callback) {
        return function () {
            // Call the client hub method
            callback.apply(hub, $.makeArray(arguments));
        };
    }

  function registerHubProxies(instance, shouldSubscribe) {
        var key, hub, memberKey, memberValue, subscriptionMethod;

      for (key in instance) {
            if (instance.hasOwnProperty(key)) {
                hub = instance[key];

              if (!(hub.hubName)) {
                    // Not a client hub
                    continue;
                }

              if (shouldSubscribe) {
                    // We want to subscribe to the hub events
                    subscriptionMethod = hub.on;
                } else {
                    // We want to unsubscribe from the hub events
                    subscriptionMethod = hub.off;
                }

              // Loop through all members on the hub and find client hub functions to subscribe/unsubscribe
                for (memberKey in hub.client) {
                    if (hub.client.hasOwnProperty(memberKey)) {
                        memberValue = hub.client[memberKey];

                      if (!$.isFunction(memberValue)) {
                            // Not a client hub function
                            continue;
                        }

                      subscriptionMethod.call(hub, memberKey, makeProxyCallback(hub, memberValue));
                    }
                }
            }
        }
    }

  $.hubConnection.prototype.createHubProxies = function () {
        var proxies = {};
        this.starting(function () {
            // Register the hub proxies as subscribed
            // (instance, shouldSubscribe)
            registerHubProxies(proxies, true);

          this._registerSubscribedHubs();
        }).disconnected(function () {
            // Unsubscribe all hub proxies when we "disconnect".  This  is to ensure that we do not re-add functional call backs.
            // (instance, shouldSubscribe)
            registerHubProxies(proxies, false);
        });

      proxies['chat'] = this.createHubProxy('chat');
        proxies['chat'].client = {};
        proxies['chat'].server = {
            send: function (message) {
                return proxies['chat'].invoke.apply(proxies['chat'], $.merge(["send"], $.makeArray(arguments)));
            },

          sendOne: function (toUserId, message) {
                return proxies['chat'].invoke.apply(proxies['chat'], $.merge(["sendOne"], $.makeArray(arguments)));
            }
        };

      return proxies;
    };

  signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false });
    $.extend(signalR, signalR.hub.createHubProxies());

}(window.jQuery, window));

signalR+redis分布式聊天服务器是如何搭建

这一块是你要是想指定具体路径也是可以的哦,但是要在后台写这么一句话

signalR+redis分布式聊天服务器是如何搭建

看完上述内容,你们掌握signalR+redis分布式聊天服务器是如何搭建的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯