• SignalR 集线器


    //1.启动
    public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Map("/signalr", map =>
                {
                    //跨域
                    map.UseCors(CorsOptions.AllowAll);
                    //集线器
                    var hubConfiguration = new HubConfiguration
                    {
                        EnableJSONP = true
                    };
                    map.RunSignalR(hubConfiguration);
                });
    
            }
        }
    //2.简单集线器
    /// <summary>
        /// 集线器
        /// </summary>
        public class CharHub : BaseHub
        {
            //log类声明为局部静态是为性能考虑
            private static readonly LogHelper LogHelper = new LogHelper();
            protected static IList<UserModel> UserModelList = new List<UserModel>();
            /// <summary>
            /// 初始化上线
            /// </summary>
            /// <param name="userid">用户id</param>
            public void Online(string userid)
            {
                string connId = Context.ConnectionId;
                LogHelper.Debug((UserModelList.Count + 1) + " 用户【" + userid + "】上线了,ConerctionId:" + connId);
                if (string.IsNullOrEmpty(userid)) { return; }
                var model = UserModelList.SingleOrDefault(q => q.UserConnerctionId == connId);
                if (model == null)
                {
                    userid = Uri.EscapeDataString(userid);
                    UserModelList.Add(new UserModel() { UserConnerctionId = connId, UserId = userid });
                }
            }
    
            /// <summary>
            /// 用户发送消息转发处理
            /// </summary>
            /// <param name="userid"></param>
            /// <param name="msg"></param>
            public void ServiceSendMsg(string userid, string msg)
            {
                if (string.IsNullOrEmpty(userid)) { return; }
                userid = Uri.EscapeDataString(userid);
                var list = UserModelList.Where(q => q.UserId == userid).ToList();
                foreach (var model in list)
                {
                    if (model != null)
                    {
                        //对于这里属于发送给Client的消息
                        //对于前端作为接收方法
                        Clients.Client(model.UserConnerctionId).ReceiveMsg(msg);
    
                    }
                }
                LogHelper.Debug(string.Format("服务推送消息给【{0}】,消息内容为{1}", userid, msg));
                //发送给所有用户
                //Clients.All.ReceiveMsg(msg);
                //发送给组
                //Clients.Group("1").ReceiveMsg(msg);
            }
            public void ServiceSendMsg(string msg)
            {
                //发送给所有用户
                Clients.All.ReceiveMsg(msg);
            }
            /// <summary>
            /// 下线
            /// </summary>
            /// <param name="stopCalled"></param>
            /// <returns></returns>
            public override Task OnDisconnected(bool stopCalled)
            {
                string connId = Context.ConnectionId;
                var model = UserModelList.SingleOrDefault(q => q.UserConnerctionId == connId);
                if (model != null)
                {
                    UserModelList.Remove(model);
                    LogHelper.Debug("用户【" + Uri.UnescapeDataString(model.UserId) + "】下线了,ConerctionId:" + connId);
                }
                return base.OnDisconnected(stopCalled);
            }
    
            /// <summary>
            /// 上线
            /// </summary>
            /// <returns></returns>
            public override Task OnConnected()
            {
                return base.OnConnected();
            }
    
            public override Task OnReconnected()
            {
                return base.OnReconnected();
            }
    
    

      //3.客户端

    public class ClinetHubTask
        {
            private static readonly string Port = ConfigurationManager.AppSettings["SignalRPort"];
            private static readonly string SignalRServerUrl = string.Format("http://localhost:{0}/signalr", Port);
            /// <summary>
            /// 消息实体推送
            /// </summary>
            /// <param name="userid"></param>
            /// <param name="msg"></param>
            public static void PushMsgForMsgObject(string userid, object msg)
            {
                //序列化
                var jsonMsg = msg as string ?? JsonConvert.SerializeObject(msg);
                PushMsg(userid, jsonMsg);
            }
            /// <summary>
            /// 推送指定客户
            /// </summary>
            /// <param name="userid"></param>
            /// <param name="msg"></param>
            public static void PushMsg(string userid, string msg)
            {
                var url = SignalRServerUrl;
                var conn = new HubConnection(url, true);
                var proxy = conn.CreateHubProxy("CharHub");
    
                conn.Start();
                conn.StateChanged += new Action<StateChange>(tgt =>
                {
                    if (((StateChange)tgt).NewState == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
                    {
                        //客户端调用服务端的 第一个方法,后面传入参数         
                        proxy.Invoke("ServiceSendMsg", userid, msg);
                    }
                });
                conn.Stop();
                conn.Dispose();
            }
    
            /// <summary>
            ///推送所有用户
            /// </summary>
            /// <param name="msg"></param>
            public static void PushAllMsg(string msg)
            {
                var url = SignalRServerUrl;
                var conn = new HubConnection(url, true);
                var proxy = conn.CreateHubProxy("CharHub");
    
                conn.Start();
                conn.StateChanged += new Action<StateChange>(tgt =>
                {
                    if (((StateChange)tgt).NewState == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
                    {
                        //客户端调用服务端的 第一个方法,后面传入参数         
                        proxy.Invoke("ServiceSendMsg", msg);
                    }
                });
                conn.Stop();
                conn.Dispose();
            }
        }

     //4.web

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>简单聊天程序</title>
        <style type="text/css">
            .container {
                background-color: #99CCFF;
                border: thick solid #808080;
                padding: 20px;
                margin: 20px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <input type="text" id="message" />
            <input type="button" id="sendmessage" value="Send" />
            <input type="hidden" id="displayname" value="uuuu" />
            <ul id="discussion"></ul>
        </div>
        <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
        <script src="Scripts/jquery.signalR-2.2.3.min.js"></script>
        <script src="http://localhost:8888/signalr/hubs"></script>
        <script type="text/javascript">
            $(function () {
                //日记记录
                $.connection.hub.logging = true;
    
                //设置hubs的url
                $.connection.hub.url = "http://localhost:8888/signalr";
    
                // 声明一个代理来引用该集线器。
                var chat = $.connection.charHub;
    
                // 创建一个方法供服务端调用
                chat.client.ReceiveMsg = function (message) {
                    var encodedName = $('<div />').text($('#displayname').val()).html();
                    var encodedMsg = $('<div />').text(message).html();
                    $('#discussion').append('<li><strong>' + encodedName + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
                    message = JSON.parse(message);
                    eval(message["FunctionName"] + "()");
                };
    
                // 启动 connection
                $.connection.hub.start().done(function () {
                    //调用服务器端方法
                    chat.server.online($('#displayname').val());
    
                    $('#sendmessage').click(function () {
                        //调用服务器端方法
                        chat.server.serviceSendMsg($('#displayname').val(), $('#message').val());
                    });
                });
            });
            //标样与量
            function aaaa() {
                //读取后台数据并且填充页面
                console.log("ddddd")
            }
        </script>
        <!--
        总结一下:
        1.先引入jq包,再引入signalR的js包,再引入signalR动态生成的hubs
        2.设置signalR的hubs url地址:$.connection.hub.url =xxx
        3.声明一个代理对象来引用集线器:var chat = $.connection.dntHub;
        4.创建一个客户端方法:chat.client.xxxx=function(){}
        5.启动并调用服务端方法:
            $.connection.hub.start().done(function(){
                chat.server.xxx()
            });
        -->
    </body>
    </html>
     
  • 相关阅读:
    hdu 4396(spfs/二维最短路)
    hdu 4360(最短路变形)
    hdu 3501(欧拉函数的应用)
    bnu 4359(数位dp)
    用Hermite插值方法估计积分值
    虞旦盛老师 的《数学分析续》课件
    数值积分中的梯形法则
    数值积分中的梯形法则
    辛普森三八律
    利用自然数的标准分解证明可数集合的所有有限子集形成的集合是可数集
  • 原文地址:https://www.cnblogs.com/zengtianli/p/9844962.html
Copyright © 2020-2023  润新知