SuperSocket 是一个轻量级, 跨平台并且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 链接和 Socket 如何工做,可是你却可使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。windows
PS:上面这句话复制官网的,好了,总之告诉你们SuperSocket已经很强大、很稳定、方便。服务器
若是你没有Socket基础,首先要了解协议;本人两年都在作智能穿戴,接触大量硬件厂商,发现大部分是“带起止符的协议”(BeginEndMarkReceiveFilter)或者“头部格式固定而且包含内容长度的协议”(FixedHeaderReceiveFilter)网络
我简单介绍这两种协议。session
代码上我就二选一介绍FixedHeaderReceiveFilter吧app
首先新建项目,在Nuget管理器上搜索“SuperSocket”安装“SuperSocket”和“SuperSocket.Engine”框架
接下来你须要实现socket
一、 IRequestInfo(请求信息,一次数据包)ide
public class MyRequestInfo : IRequestInfo { public MyRequestInfo(byte[] header, byte[] bodyBuffer) { Key = ((header[0] * 256) + header[1]).ToString(); Data = bodyBuffer; } /// <summary> /// 协议号对应自定义命令Name,会触摸自定义命令 /// </summary> public string Key { get; set; } /// <summary> /// 正文字节码 /// </summary> public byte[] Data { get; set; } /// <summary> /// 正文文本,大部分协议都不是这么玩的 /// </summary> public string Body { get { return Encoding.UTF8.GetString(Data); } } }
二、 FixedHeaderReceiveFilter<IRequestInfo>(数据包的解析)性能
public class MyReceiveFilter : FixedHeaderReceiveFilter<MyRequestInfo> { /// +-------+---+-------------------------------+ /// |request| l | | /// | name | e | request body | /// | (2) | n | | /// | |(2)| | /// +-------+---+-------------------------------+ public MyReceiveFilter() : base(4) { } protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length) { return (int)header[offset + 2] * 256 + (int)header[offset + 3]; } protected override MyRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length) { var body = bodyBuffer.Skip(offset).Take(length).ToArray(); return new MyRequestInfo(header.Array, body); } }
三、 AppSession<TAppSession, TRequestInfo>(Session会话,服务端管理客户端的链接、信息)测试
public class MySession : AppSession<MySession, MyRequestInfo> { public MySession() { }protected override void OnSessionStarted() { } protected override void OnInit() { base.OnInit(); } protected override void HandleUnknownRequest(MyRequestInfo requestInfo) { } protected override void HandleException(Exception e) { } protected override void OnSessionClosed(CloseReason reason) { base.OnSessionClosed(reason); } }
四、 AppServer<TAppSession, TRequestInfo>(监听服务)
public class MyServer : AppServer<MySession, MyRequestInfo> { /// <summary> /// 经过配置文件安装服务从这里启动 /// </summary> public MyServer() : base(new DefaultReceiveFilterFactory<MyReceiveFilter, MyRequestInfo>()) { this.NewSessionConnected += MyServer_NewSessionConnected; this.SessionClosed += MyServer_SessionClosed; } /// <summary> /// winform启动,不使用这里的事件 /// </summary> public MyServer(SessionHandler<MySession> NewSessionConnected, SessionHandler<MySession, CloseReason> SessionClosed) : base(new DefaultReceiveFilterFactory<MyReceiveFilter, MyRequestInfo>()) { this.NewSessionConnected += NewSessionConnected; this.SessionClosed += SessionClosed; } protected override void OnStarted() { //启动成功 LogHelper.WriteLog(string.Format("Socket启动成功:{0}:{1}", this.Config.Ip, this.Config.Port)); } void MyServer_NewSessionConnected(MySession session) { //链接成功 } void MyServer_SessionClosed(MySession session, CloseReason value) { } }
好了,你能够跑起来
var config = new SuperSocket.SocketBase.Config.ServerConfig() { Name = "SSServer", ServerTypeName = "SServer", ClearIdleSession= true, //60秒执行一次清理90秒没数据传送的链接 ClearIdleSessionInterval = 60, IdleSessionTimeOut = 90, MaxRequestLength = 2048, //最大包长度 Ip = "Any", Port = 18888, MaxConnectionNumber = 100000, }; app = new MyServer(app_NewSessionConnected, app_SessionClosed); LogHelper.SetOnLog(new LogHelper.LogEvent((m) => { txtAll.Text = string.Join(" ", m, "\r\n"); txtAll.Select(txtAll.TextLength, 0); txtAll.ScrollToCaret(); })); app.Setup(config); if (!app.Start()) { LogHelper.WriteLog(string.Format("Socket {0}:{1}启动失败,请检查权限或端口是否被占用!", config.Ip, config.Port)); }
有关性能,本人在本地(笔记本i5 4200H/12G)测试10万链接同时在线,没有问题;固然啦,跟业务有关,好比你要作的是IM群聊,数据到服务端须要频繁计算。
最后我还有一些提示
一、 尽量使用安装成windows服务,这样性能、稳定性更好;若是前期链接数不大也可用winform中启动
二、 若是终端可选.net,那使用SuperSocket.ClientEngine比本身又从新敲更稳健
三、 心跳包应在终端向服务端发送,服务端响应便可,切勿在服务端向终端发心跳(服务端拥有超时机制,若超时终端重连便可)
四、 若是须要支持WebSocket,参考SuperWebScoket;有的网友直接在WebSocket直接链接SuperSocket当即断开
五、 有的人问怎么传JSON,参照本文图1先把数据转JSON再转byte[]放到正文内容部分
六、 作Socket开发,可能常常须要在十进制、十六进制、256进制之间转换(尤为是在省流量的仅支持2G网络的硬件)
七、若是你在作硬件开发,你所处的电脑又没有外网IP,可以使用ngrok反向代理TCP,让别人代理访问你的电脑
有关其余协议或介绍请参考官方文档
http://docs.supersocket.net/v1-6/zh-CN
有关客户端或本例子代码(可直接运行),若是你想先运行看看结果,再本身敲一遍
连接: https://pan.baidu.com/s/1hs09vb2 密码: 4ntg