官网:www.supersocket.net/
文档:http://docs.supersocket.net/v1-6/zh-CN
从8.1号开始尝试用它,昨天只试了文档中的Telnet的示例,挺顺利的。但我要做WebSocket呀,怎么办呢,整个文件都不提WebSocket ,我也没有找到怎么设定appServer为WebSocket类型呀!晚上翻手机,发现官网上:
SuperWebSocket 是一个基于SuperSocket开发的,兼容Mono的 WebSocket服务器; [Codeplex][Github]
去GitHub上看到这句:SuperWebSocket is being merged into SuperSocket as an additional module .WebSocket. You can useSuperSocket.WebSocket in the same way with SuperWebSocket but with a different namespace.
原来WebSocket已经做成一个组件了,插入到SuperSocket空间下面。 然后用法 不变,只是命名空间要增加一个SuperSocket ,同时它没有自己的官网 ,也没有自己的文档,有点坑!
废话不说了,转入正题
下面是通过vs2015的NuGet需要引入的。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="log4net" version="2.0.3" targetFramework="net452" />
<package id="SuperSocket" version="1.6.6.1" targetFramework="net452" />
<package id="SuperSocket.Engine" version="1.6.6.1" targetFramework="net452" />
<package id="SuperSocket.WebSocket" version="1.6.6.1" targetFramework="net452" />
</packages>
我反复折腾了好久,其实最简单是先安装SuperSocket.WebSocket这个包就行,然后它会引用其它2个。再安装SuperSocket.Engine包,没有这个还会报错。不知道为什么作者不直接给SuperSocket.WebSocket包增加上Engine的依赖。
经过摸索和参考GitHub上的Sample目录,能启动一个服务器了。就直接贴代码了:
//MyWS.CS
class MyWS
{
WebSocketServer wsApp;
public void Start()
{
wsApp = new WebSocketServer();
wsApp.NewSessionConnected += WsApp_NewSessionConnected;
//下面是通过事件响应信息的代码,如果想用命令的话,要注释掉事件,增加上命令相关的类!
//wsApp.NewMessageReceived +=new SessionHandler<WebSocketSession, string>( WsApp_NewMessageReceived);
//private void WsApp_NewMessageReceived(WebSocketSession session, string value)
//{
// session.Send("you just send msg=" + value.ToString());
//}
if (!wsApp.Setup(20000))
{
Console.WriteLine("未能Set up ws");
}
if (!wsApp.Start()) //Setup with listening port
{
Console.WriteLine("未能启动ws");
}
}
public void Stop()
{
if (wsApp.State == SuperSocket.SocketBase.ServerState.Running)
wsApp.Stop();
}
private void WsApp_NewSessionConnected(WebSocketSession session)
{
session.Send("you are connected!" + session.ToString());
}
}
//Program.cs
class Program
{
static void Main(string[] args)
{
MyWS ws = new MyWS();
ws.Start();
while (Console.ReadKey().KeyChar != 'q')
{
Console.WriteLine("........");
continue;
}
ws.Stop();
}
}
以上代码就能运行了。只是不响应任何消息。下面是增加命令的方法:
//在项目命名空间中,随便增加这样一个类,就能响应指定的命令了
public class ADD : SubCommandBase
{
public override void ExecuteCommand(WebSocketSession session, SubRequestInfo requestInfo)
{
var paramArray = requestInfo.Body.Split(' ');
session.Send((int.Parse(paramArray[0]) + int.Parse(paramArray[1])).ToString());
}
}
客户端的JS代码如下:
ws=new WebSocket("ws://localhost:20000");
ws.onmessage=(function(msg){console.log(msg.data)})
ws.send("add 5 2") //控制台响应 7