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="Logs\err.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="Logs\info.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="Logs\debug.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="Logs\perf.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>

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

 

posted @ 2014-09-26 16:44  skin33  阅读(566)  评论(0编辑  收藏  举报