使用SuperSocket打造逾10万长连接的Socket服务
原文:使用SuperSocket打造逾10万长连接的Socket服务

SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。

PS:上面这句话复制官网的,好了,总之告诉大家SuperSocket已经很强大、很稳定、方便。

如果你没有Socket基础,首先要了解协议;本人两年都在做智能穿戴,接触大量硬件厂商,发现大部分是“带起止符的协议”(BeginEndMarkReceiveFilter)或者“头部格式固定并且包含内容长度的协议”(FixedHeaderReceiveFilter)

我简单介绍这两种协议。

代码上我就二选一介绍FixedHeaderReceiveFilter吧

首先新建项目,在Nuget管理器上搜索“SuperSocket”安装“SuperSocket”和“SuperSocket.Engine”

接下来你需要实现

1、 IRequestInfo(请求信息,一次数据包)

    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);}}}

2、 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);}}

3、 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);}}

4、 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群聊,数据到服务端需要频繁计算。

最后我还有一些提示

1、 尽可能使用安装成windows服务,这样性能、稳定性更好;如果前期连接数不大也可用winform中启动

2、 如果终端可选.net,那使用SuperSocket.ClientEngine比自己又重新敲更稳健

3、 心跳包应在终端向服务端发送,服务端响应即可,切勿在服务端向终端发心跳(服务端拥有超时机制,若超时终端重连即可)

4、 如果需要支持WebSocket,参考SuperWebScoket;有的网友直接在WebSocket直接连接SuperSocket立即断开

5、 有的人问怎么传JSON,参照本文图1先把数据转JSON再转byte[]放到正文内容部分

6、 做Socket开发,可能经常需要在十进制、十六进制、256进制之间转换(尤其是在省流量的仅支持2G网络的硬件)

7、如果你在做硬件开发,你所处的电脑又没有外网IP,可使用ngrok反向代理TCP,让别人代理访问你的电脑

有关其他协议或介绍请参考官方文档

http://docs.supersocket.net/v1-6/zh-CN

有关客户端或本例子代码(可直接运行),如果你想先运行看看结果,再自己敲一遍

链接: https://pan.baidu.com/s/1hs09vb2 密码: 4ntg

posted on 2018-06-14 02:47 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9181132.html

使用SuperSocket打造逾10万长连接的Socket服务相关推荐

  1. NGINX轻松管理10万长连接

    一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点.本文做一个简单测试,NGINX在一个普通PC虚拟 ...

  2. [NewLife.Net]单机400万长连接压力测试

    目标 对网络库NewLife.Net进行单机百万级长连接测试,并持续收发数据,检测网络库稳定性. [2020年8月1日晚上22点] 先上源码:https://github.com/NewLifeX/N ...

  3. 华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...

    原标题:鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大 上周五,大家期待已经的华为开发者大会正式召开,华为鸿蒙系统在这一天对外发布.历时数年,经过几千人的研发,终于正式落地. 曾经,华为投入大量 ...

  4. Netty-WebSocket长连接推送服务

    Netty-WebSocket长连接推送服务  November 25, 2015 推送服务 推送服务 几种消息推送技术比较 AJAX轮询 轮询:缺点,糟糕的用户体验:对服务器压力很大,并造成带宽的极 ...

  5. android socket 长连接_php socket如何实现长连接

    长连接是什么? 朋友们应该都见过很多在线聊天工具和网页在线聊天的工具.学校内有一种熟悉的功能,如果有人回复你了,网站会马上出现提示,此时你并没有刷新页面:Gmail也有此功能,如果邮箱里收到了新的邮件 ...

  6. java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信

    netty学习-实现websocket长连接和socket之间通信 最近正在学习netty,跟着教程写了一个基于WebSocket的网页聊天室,对netty有了一定的了解,现在正好项目使用到长连接,选 ...

  7. 20万台联网医用输液泵中,逾10万台含未修复的老旧严重漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Palo Alto Networks 公司的安全研究员分析了20多万台联网医疗输液泵后发现,75%的输液泵中含有可遭攻击者利用的已知安全漏洞.这 ...

  8. 微信 短连接 长连接服务器,Socket,http长连接与短连接

    TCP/IP TCP/IP是个协议组,可分为三个层次:网络层,传输层和应用层. 在网络层有IP协议,ICMP协议,ARP协议,RARP协议和BOOTP协议. 在传输层中有:TCP协议与UDP协议. 在 ...

  9. 即时通讯的业务场景和需求与短连接,长连接,Socket介绍大杂烩

    即时通讯的业务场景和需求 即时通信(Instant Messaging,简称IM)是一个允许两人或多人使用网络实时的传递文字消息.文件.语音与视频交流. 即时通讯技术应用于需要实时收发消息的业务场景. ...

最新文章

  1. 【AI产品】一键去除杂物,Photo Eraser助你拍出美丽照片
  2. Visual Studio 2017 针对移动开发的新特性介绍
  3. SpringCloud Greenwich(七)集成dubbo先启动消费者(check=false),然后启动提供者无法自动发现注册
  4. atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity
  5. 基于ubuntu18.04LTS SERVER版的基础系统安装过程
  6. css里的符号含义【串联选择器】和【后代选择器】
  7. 2019.03.21 创建表 一对多,一对一,多对多。
  8. 最难的几道Java面试题,看看你跪在第几个?
  9. Windows窗口程序设计入门(C#版)
  10. 【转】RIS/PACS系统实施过程中Worklist的配置与调试
  11. 机械设计:机械加工中获得工件尺寸精度的常用方法!
  12. android 下拉刷新 组件,Android实现简单的下拉刷新控件
  13. 2021年江西省研究生数学建模竞赛题目(二)题目:全国人口普查问题
  14. openstack安装文档
  15. 用Python实现数据筛选与匹配
  16. startx analyze
  17. RobotFramework入门基础教程
  18. 怎么在mysql中创建用户名和密码是什么_mysql中怎么创建用户名和密码
  19. linux不识别U盘
  20. PRML第八章读书笔记——Graphical Models 生成式模型/超先验/层次贝叶斯模型、d-分离/朴素贝叶斯、有向分解/马尔可夫毯、D图I图完美图、马尔科夫链/因子图/和积算法/最大和算法

热门文章

  1. SAP CRM里business partner在订单处理中的determination流程
  2. Java和ABAP中的几种引用类型的分析和比较
  3. Netweaver和CloudFoundry是如何运行Web应用的?
  4. python最小化打开exe_如何用python使GoAgent窗口打开后自动最小化以及关闭之前的py.exe窗口...
  5. proxy connect abort处理方法_Java代理设计模式(Proxy)的几种具体实现
  6. 11岁过python1级_11岁表弟写的Python零基础入门笔记!
  7. mr利用mapjoin计算出每个部门的总工资以及部门名称
  8. hadoop—集群配置历史服务器及访问历史服务器日志
  9. linux tree命令源码,[转帖]linux tree命令--显示目录的树形结构
  10. python中truncate的用法_在Python中操作文件之truncate()方法的使用教程