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

浙公网安备 33010602011771号