• 使用SuperWebSocket实现Web消息推送


      在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。

    引用SuperWebSocket相关组件后,在项目中添加WebSocketManager类

    using SuperWebSocket;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    namespace WebSocketDemo
    {
        public static class WebSocketManager
        {
            static Dictionary<string, WebSocketSession> sessionDics = new Dictionary<string, WebSocketSession>();
            static WebSocketServer webSocketServer;
            public static void Init()
            {
                var ip = GetLocalIP();
                webSocketServer = new WebSocketServer();
    
                var isSetup = webSocketServer.Setup(ip, 2019);
                Common.LogHelper.WriteError("WebSocketManager: 服务器端启动" + (isSetup ? "成功" : "失败"));
                if (!isSetup)
                    return;
    
                webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected;
                webSocketServer.SessionClosed += WebSocketServer_SessionClosed;
                webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived;
    
                var isStart = webSocketServer.Start();
                Common.LogHelper.WriteError("WebSocketManager: 服务器端侦听" + (isStart ? "成功" : "失败"));
            }
    
            /// <summary>
            /// 接收消息
            /// </summary>
            /// <param name="session"></param>
            /// <param name="value"></param>
            private static void WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
            {
                Common.LogHelper.WriteError("WebSocketManager: 接收消息 
    " + value);
    
                if (!string.IsNullOrWhiteSpace(value))
                {
                    if (!sessionDics.ContainsKey(value))
                        sessionDics.Add(value, session);
                    else
                        sessionDics[value] = session;
    
                }
            }
    
            /// <summary>
            /// 下线
            /// </summary>
            /// <param name="session"></param>
            /// <param name="value"></param>
            private static void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
            {
                Common.LogHelper.WriteError(string.Format("WebSocketManager:{0} {1}下线", value, session.RemoteEndPoint));
            }
    
            /// <summary>
            /// 上线
            /// </summary>
            /// <param name="session"></param>
            private static void WebSocketServer_NewSessionConnected(WebSocketSession session)
            {
                Common.LogHelper.WriteError(string.Format("WebSocketManager:{0}上线",session.RemoteEndPoint));
            }
    
            /// <summary>
            /// 发送消息到客户端
            /// </summary>
            /// <param name="value"></param>
            /// <param name="msg"></param>
            public static void SendMsgToRemotePoint(string value, string msg)
            {
                if (sessionDics.ContainsKey(value))
                {
                    var webSocketSession = sessionDics[value];
                    if (webSocketSession != null)
                    {
                        webSocketSession.Send(msg);
                    }
                }
            }
    
    
            /// <summary>
            /// 获取本地IP等信息
            /// </summary>
            /// <returns></returns>
            public static string GetLocalIP()
            {
                //本机IP地址 
                string strLocalIP = "";
                //得到计算机名 
                string strPcName = Dns.GetHostName();
                //得到本机IP地址数组 
                IPHostEntry ipEntry = Dns.GetHostEntry(strPcName);
                //遍历数组 
                foreach (var IPadd in ipEntry.AddressList)
                {
                    //判断当前字符串是否为正确IP地址 
                    if (IsRightIP(IPadd.ToString()))
                    {
                        //得到本地IP地址 
                        strLocalIP = IPadd.ToString();
                        //结束循环 
                        break;
                    }
                }
    
                //返回本地IP地址 
                return strLocalIP;
            }
            /// <summary>
            /// 判断是否为正确的IP地址
            /// </summary>
            /// <param name="strIPadd">需要判断的字符串</param>
            /// <returns>true = 是 false = 否</returns>
            private static bool IsRightIP(string strIPadd)
            {
                //利用正则表达式判断字符串是否符合IPv4格式
                if (Regex.IsMatch(strIPadd, "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"))
                {
                    //根据小数点分拆字符串
                    string[] ips = strIPadd.Split('.');
                    if (ips.Length == 4 || ips.Length == 6)
                    {
                        //如果符合IPv4规则
                        if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1]) < 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256)
                            //正确
                            return true;
                        //如果不符合
                        else
                            //错误
                            return false;
                    }
                    else
                        //错误
                        return false;
                }
                else
                    //错误
                    return false;
            }
        }
    }

    在Global.asax.cs下初始化WebSocket,并启动。

     public class WebApiApplication : System.Web.HttpApplication
     {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                WebSocketManager.Init();
            }
      }

    前端连接服务端WebSocket,打开网页调用此js方法,就可以和服务端建立长连接通信。

    WebSocketConnent(){
        var ip= localStorage.getItem("IP");//服务端的IP
        var openId= localStorage.getItem("kmWechatOpenId");//value
        var url="ws://"+ip+":2019";
    var ws; if ("WebSocket" in window) { ws = new WebSocket(url); } else if ("MozWebSocket" in window) { ws = new MozWebSocket(url); } else{ console.log("WebSocketConnent","浏览器版本过低,请升级您的浏览器") } //注册各类回调 ws.onopen = function () { ws.send(openId);//服务端WebSocketServer_NewMessageReceived 接收到消息 console.log("WebSocketConnent","连接服务器成功"); } ws.onclose = function () { console.log("WebSocketConnent","与服务器断开连接"); } ws.onerror = function () { console.log("WebSocketConnent","数据传输发生错误"); } ws.onmessage = function (receiveMsg) { localStorage.removeItem("token");//服务端SendMsgToRemotePoint 发送消息后接收 console.log("WebSocketConnent","服务器推送过来的消息:"+receiveMsg.data); } },
  • 相关阅读:
    Lock和synchronized的区别和使用(转发)
    redis集群配置
    分布式之redis(转发)
    拉格朗日乘法与KKT条件
    骨骼动画原理
    常用非线性优化算法总结
    广义线性回归模型(三)
    线性模型、最优化方法(二)
    矩阵微分基础(一)
    OpenGL坐标系统
  • 原文地址:https://www.cnblogs.com/lizhenhong/p/10819786.html
Copyright © 2020-2023  润新知