• SuperWebSocket


    using System.Net.Sockets?no

    在这里我们将一起学习简单的Socket, 就是SuperWebSocket,仅为需要用到的你提供帮助。这么写感觉好奇怪

    工作久了就发现了解一个新的东西 习惯方式就是百度 当然当你百度不到的时候 最好的方式就是书籍 好了进入正题 鉴于对近期项目的需要开始学快速开发类库SuperWebSocket,为什么不自己写 NO  那不是我们想要的

     什么是SuperWebSocket?

    SuperWebSocket是WebSocket协议服务器端的.NET实现.

    作为HTML5的一个重要新特性,WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送(股票行情),游戏,聊天/im 等.

    如果没有这些类库 我们必须手写底层的通讯协议等一大推需要考虑的东西,但是作为c# 程序员的我们都已经是站在巨人的肩膀上了 为什么不好好的靠着大树乘凉了?

    OK

    我们先看一段代码,

    var url = "ws://127.0.0.1:2015";
    var ws = null;
    Socket = {
        Init: function (fullUrl, messageIng, open) {
            fullUrl = url + "/" + fullUrl;
            if ("WebSocket" in window) {
                ws = new WebSocket(fullUrl);
            } else if ("MozWebSocket" in window) {
                ws = new window.MozWebSocket(fullUrl);
            } else {
                alert("浏览器不支持WebSocket");
            }
    
            ws.onclose = function () {
                alert("与服务器断开连接");
            };
            ws.onerror = function () {
                alert("通信发生错误");
            };
            ws.onmessage = function (msg) {
                messageIng(msg.data);
            };
            ws.onopen = function () {
                open();
            };
        },
        SendMessage: function (flag, msg, type) {
            var parm = { SendTo: flag, Msg: msg, Type: type };
            if (ws) {
                ws.send($.toJSON(parm));
            }
        }
    
    };
    

     这里是简单的前台示例 是不是很简单,对  ws = new WebSocket(fullUrl); 这里是HTML5有的东西 不得不说这个真的很强大

     private WebSocketServer ws = null;//SuperWebSocket中的WebSocketServer对象
    //        private static Dictionary<string, string> conlist = new Dictionary<string, string>();
    //        public ChatWebSocket()
    //        {
    //            ws = new WebSocketServer();//实例化WebSocketServer
    
    //            //添加事件侦听
    //            ws.NewSessionConnected += ws_NewSessionConnected;//有新会话握手并连接成功
    //            ws.SessionClosed += ws_SessionClosed;//有会话被关闭 可能是服务端关闭 也可能是客户端关闭
    //            //ws.NewMessageReceived += ws_NewMessageReceived;//有客户端发送新的消息
    
    //        }
    //        void ws_NewSessionConnected(WebSocketSession session)
    //        {
    
    //            Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}创建新会话", DateTime.Now, GetSessionName(session));
    //            var msg = string.Format("{0:HH:MM:ss} {1} 进入聊天室", DateTime.Now, GetSessionName(session));
    //            SendToAll(session, msg);
    //        }
    
    //        void ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
    //        {
    //            Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}的会话被关闭 原因:{2}", DateTime.Now, GetSessionName(session), value);
    //            Console.WriteLine(session.Host);
    //            var msg = string.Format("{0:HH:MM:ss} {1} 离开聊天室", DateTime.Now, GetSessionName(session));
    //            SendToAll(session, msg);
    //        }
    //        void ws_NewMessageReceived(WebSocketSession session, string value)
    //        {
    //            var msg = string.Format("{0:HH:MM:ss} {1}说: {2}", DateTime.Now, GetSessionName(session), value);
    
    //            SendToAll(session, msg);
    
    //        }
    //        /// <summary>
    //        /// 启动服务
    //        /// </summary>
    //        /// <returns></returns>
    //        public void Start()
    //        {
    //            if (!ws.Setup(new Config ()))
    //            {
    //                Console.WriteLine("ChatWebSocket 设置WebSocket服务侦听地址失败");
    //                return;
    //            }
    
    //            if (!ws.Start())
    //            {
    //                Console.WriteLine("ChatWebSocket 启动WebSocket服务侦听失败");
    //                return;
    //            }
    
    //            Console.WriteLine("ChatWebSocket 启动服务成功");
    
    //            Console.WriteLine("The server started successfully, press key 'q' to stop it!");
    
    //            while (Console.ReadKey().KeyChar != 'q')
    //            {
    //                Console.WriteLine();
    //                continue;
    //            }
    
    //            ws.Stop();
    
    //            Console.WriteLine("The server was stopped!");
    //            Console.ReadKey();
    
    
    //        }
    
    //        /// <summary>
    //        /// 停止侦听服务
    //        /// </summary>
    //        public void Stop()
    //        {
    
    //            if (ws != null)
    //            {
    //                ws.Stop();
    //            }
    //        }
    
    //        private string GetSessionName(WebSocketSession session)
    //        {
    //            //这里用Path来取Name 不太科学…… 
    //            return HttpUtility.UrlDecode(session.Path.TrimStart('/'));
    //        }
    
    //        private void SendToAll(WebSocketSession session, string msg)
    //        {
    //            //广播
    //            foreach (var sendSession in session.AppServer.GetAllSessions())
    //            {
    //                sendSession.Send(msg);
    //            }
    
    //        }
    //    }
    //}
    
     public class Config : ServerConfig
        {
            public Config()
            {
                if (ConfigurationManager.AppSettings["APWebSocketIP"] != null)
                {
                    Ip = ConfigurationManager.AppSettings["APWebSocketIP"];
                }
                if (ConfigurationManager.AppSettings["APWebSocketPort"] != null)
                {
                    Port = int.Parse(ConfigurationManager.AppSettings["APWebSocketPort"]);
                }
                if (ConfigurationManager.AppSettings["APWebSocketMaxConnection"] != null)
                {
                    MaxConnectionNumber = int.Parse(ConfigurationManager.AppSettings["APWebSocketMaxConnection"]);
                }
            }
    
        }
    

    上面这段是简单的服务端搭建 是不是越来越简单 对 这样你就能搭建传说中的聊天室了 或者说 消息的互通了 刚开始接触的时候写完本能的运行起来,但是

    网上的资料真的很少 不信你去百度 so 自己多多看文档吧 这里是文档地址http://docs.supersocket.net/v1-6/zh-CN/

    这是它的母亲 还是很有帮助的 不过介于JS段访问还是有很多疑问 所以我们简简单单的把它当一个内裤学习就好,到现在为止 我觉得也没有什么好的方式可以实施的通讯,轮训,常连接,这些都过去了 相信以后也会有更多的方式可以让我们使用。

    这里提一下服务端的注意

    1  防火墙 对的 就是这个鬼

    期间考虑到可能有其它方式访问 这里也提供一个方式

      private static void ConnectSocketTest()
            {
    
                ///客户端访问webSOCKET接口方法
                UserInfo info = new UserInfo();
                info.UserFlag = "aa";
                info.GroupFlag = "bb";
    
                WebSocket4Net.WebSocket ws = new WebSocket4Net.WebSocket("ws://127.0.0.1:2014/" + JsonConvert.SerializeObject(info));
    
                ws.Open();
            
                if (ws.State == WebSocket4Net.WebSocketState.Connecting)
                {
                    ws.Send("aaaaaa");
                }
                ws.Close();
            }
    

     using WebSocket4Net;//这个是webSocket的客户端 需要用到这个DLL  这个是可以下到的

    一般这两种方式基本满足你的需求了 还要提一点 这个类库是支持简单的日志的 只需要简单的LOG4G配置一下就可以了这里也贴出代码

    <?xml version="1.0" encoding="utf-8" ?>
    <log4net>
        <appender name="errorAppender" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LevelMatchFilter">
                <levelToMatch value="ERROR" />
            </filter>
            <filter type="log4net.Filter.DenyAllFilter" />
            <file value="Logserr.log" />
            <encoding value="utf-8"/>
            <preserveLogFileNameExtension value="true" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
            </layout>
        </appender>
        <appender name="infoAppender" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LevelMatchFilter">
                <levelToMatch value="INFO" />
            </filter>
            <filter type="log4net.Filter.DenyAllFilter" />
            <file value="Logsinfo.log" />
            <encoding value="utf-8"/>
            <preserveLogFileNameExtension value="true" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
            </layout>
        </appender>
        <appender name="debugAppender" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LevelMatchFilter">
                <levelToMatch value="DEBUG" />
            </filter>
            <filter type="log4net.Filter.DenyAllFilter" />
            <file value="Logsdebug.log" />
            <encoding value="utf-8"/>
            <preserveLogFileNameExtension value="true" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
            </layout>
        </appender>
        <appender name="perfAppender" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LevelMatchFilter">
                <levelToMatch value="INFO" />
            </filter>
            <filter type="log4net.Filter.DenyAllFilter" />
            <file value="Logsperf.log" />
            <encoding value="utf-8"/>
            <preserveLogFileNameExtension value="true" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date %logger - %message%newline" />
            </layout>
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="errorAppender" />
            <appender-ref ref="infoAppender" />
            <appender-ref ref="debugAppender" />
        </root>
        <logger name="Performance" additivity="false">
          <level value="ALL" />
          <appender-ref ref="perfAppender" />
        </logger>
    </log4net>
    

     一些其它的细节 你可以在文档里好好看看 多看几遍 就会了  楼主也在学习中 这里只是给需要的人提供一个例子,也给自己留个印子

    不是世界太黑,而是你不够白
  • 相关阅读:
    mongoDB看这篇就够了
    放不下
    jmeter连接不上MySQL数据库的原因以及解决方法
    SecureCRT自动断开连接的解决方法
    Linux及Windows查看占用端口的进程
    网络基础知识
    selenium中driver.close()和driver.quit()的不同点
    day2_窗口句柄切换
    day6_异常捕捉
    day6_logging模块
  • 原文地址:https://www.cnblogs.com/dinghuijun/p/3995207.html
Copyright © 2020-2023  润新知