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>
 
原文地址:https://www.cnblogs.com/zengtianli/p/9844962.html