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