C# 使用SuperSocket

摘要:
--配置SocketServer路径--˃说明:server节点的serverType的属性值第一个是SocketServer的位置,第二个是程序集的名称。

一、需求场景

(1)使用SuperSocket进行网络通信

二、所需软件

(1)SocketTool

三、实现步骤

(1)使用Nuget管理器安装SuperSocket.Engine

C# 使用SuperSocket第1张

该插件已经包含(SuperSocket插件)

注意:SuperSocket里面集成了log4net(如果你的程序中已经引入了log4net,一定要注意版本是否一致,如果不一致,会报错)

C# 使用SuperSocket第2张

(2)新建一个SocketSession类,继承自AppSession

1 usingSuperSocket.SocketBase;
2 usingSystem;
3 usingSystem.Text;
4 usingSuperSocket.SocketBase.Protocol;
5 
6 namespaceSuperSocketBlog
7 {
8     public class SocketSession : AppSession<SocketSession>
9 {
10         public override void Send(stringmessage)
11 {
12             Console.WriteLine("发送消息:" +message);
13             base.Send(message);
14 }
15 
16         protected override voidOnSessionStarted()
17 {
18             Console.WriteLine("Session已启动");
19             base.OnSessionStarted();
20 }
21 
22         protected override voidOnInit()
23 {
24             this.Charset = Encoding.GetEncoding("gb2312");
25             base.OnInit();
26 }
27 
28         protected override voidHandleUnknownRequest(StringRequestInfo requestInfo)
29 {
30             Console.WriteLine("遇到未知的请求");
31             base.HandleUnknownRequest(requestInfo);
32 }
33 }
34 }

(3)新建一个SocketServer类,继承自AppServer

1 usingSuperSocket.SocketBase;
2 usingSystem;
3 usingSuperSocket.SocketBase.Config;
4 
5 namespaceSuperSocketBlog
6 {
7     public class SocketServer : AppServer<SocketSession>
8 {
9         protected override boolSetup(IRootConfig rootConfig, IServerConfig config)
10 {
11             Console.WriteLine("正在准备配置文件");
12             return base.Setup(rootConfig, config);
13 }
14 
15         protected override voidOnStarted()
16 {
17             Console.WriteLine("服务已开始");
18             base.OnStarted();
19 }
20 
21         protected override voidOnStopped()
22 {
23             Console.WriteLine("服务已停止");
24             base.OnStopped();
25 }
26         protected override voidOnNewSessionConnected(SocketSession session)
27 {
28             Console.WriteLine("新的连接地址为" + session.LocalEndPoint.Address.ToString() + ",时间为" +DateTime.Now);
29             base.OnNewSessionConnected(session);
30 }
31 }
32 }

(4)在配置文件中进行配置,配置后的代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="superSocket"type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
    <section name="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <!--配置SocketServer路径-->
  <superSocket>
    <servers>
      <server name="MySocket"textEncoding="gb2312"serverType="SuperSocketBlog.SocketServer, SuperSocketBlog"ip="Any"port="2018"maxConnectionNumber="100">
      </server>
    </servers>
  </superSocket>
    <startup> 
        <supportedRuntime version="v4.0"sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

说明:server节点的serverType的属性值第一个是SocketServer的位置,第二个是程序集的名称。

(5)添加命令类Apply,继承自CommandBase

1 usingSuperSocket.SocketBase.Command;
2 usingSuperSocket.SocketBase.Protocol;
3 usingSystem;
4 
5 namespaceSuperSocketBlog
6 {
7     public class Apply:CommandBase<SocketSession,StringRequestInfo>
8 {
9         public override voidExecuteCommand(SocketSession session, StringRequestInfo requestInfo)
10 {
11             //根据参数个数或者其他条件判断,来进行一些自己的操作
12             if (requestInfo.Parameters.Length==2)
13 {
14                 Console.WriteLine("调用成功");
15                 session.Send("已经成功接收到你的请求
");
16 }
17             else
18 {
19                 session.Send("参数不正确
");
20 }
21 }
22 }
23 }

(6)在Program.cs文件中对Socket进行初始化

1             #region 初始化Socket
2             IBootstrap bootstrap =BootstrapFactory.CreateBootstrap();
3             if (!bootstrap.Initialize())
4 {
5                 Console.WriteLine(DateTime.Now + ":Socket初始化失败
");
6                 return;
7 }
8 
9             var result =bootstrap.Start();
10             foreach (var server inbootstrap.AppServers)
11 {
12                 if (server.State ==ServerState.Running)
13 {
14                     Console.WriteLine(DateTime.Now + ":serverName为:" + server.Name + "Socket运行中
");
15 Console.Read();
16 }
17                 else
18 {
19                     Console.WriteLine(DateTime.Now + ":serverName为:" + server.Name + "Socket启动失败
");
20 }
21 }
22             #endregion

四、测试

(1)初始化界面

C# 使用SuperSocket第3张

(2)打开SocketTool软件,新建一个客户端,连接的端口号(2018)要和上面配置文件中设置的端口号一致。

C# 使用SuperSocket第4张

(3)点击连接按钮效果图

C# 使用SuperSocket第5张

(4)使用Apply命令效果图

C# 使用SuperSocket第6张

说明:(1)发送请求时中间用空格隔开,默认第一个参数为命令名称(和刚才建立的命令类Apply要一致),后面的是需要传递的参数。

(2)使用SocketTool软件发送请求的时候,要按回车,再点击发送,服务器端才可以接收到。

问题:(1)如果需求场景变为:可以接收json字符串或者命令(不限制命令名称)格式。则该程序如果接收到Json字符串或者除Apply之外的命令,就需要在SocketSession类里面的

HandleUnknownRequest方法里进行处理。
(2)如果不限定命令名称,统一对发送的信息进行处理该怎么写呢?

写在后面的话:SuperSocket只是会简单的连接,发信息,其实对原理还有更深层的编程不熟悉,还需要再进行深层次的探索。忽然发现好像每一篇文章的最后都有类似的话语,每一个都研究的不深入,只是皮毛而已呢(捂脸)。

免责声明:文章转载自《C# 使用SuperSocket》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CocoaPods的安装、使用及常用命令vue3自定义Table组件源码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php session跨页面传递 session值丢失问题

1、session_start();应该尽量放置到页面的顶部; 2、如果php.ini里面没有配置 session Autostart的话,每次会话之前,都得手动开启session:session_start(); 3、session是php里面的超全局变量,跟$_GET,$_POST,$_SERVER一样,所以使用的时候必须大写:$_SESS...

ORACLE快速彻底Kill掉的会话

来源于:http://www.cnblogs.com/kerrycode/p/4034231.html 在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源,有时候你会发现锁定的资源很长时间也不会释放,即使会话...

Oracle 中session和processes的初始设置

http://blog.163.com/succu/blog/static/193917174201252911727149/ 1.sessions 在初始化参数所设定的限制中,最为人所知的估计就是sessions和processes Sessions 参数指定了一个 Instance中能够同时存在的sessions数量,或者说,就是能同时登陆到数据库的...

【转】tomcat 设置 session 过期时间

转自: http://hi.baidu.com/feelixus/blog/item/30c2394ee6f4dbccd0c86ade.html 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在tomcat-->conf-->...

Golang 对MongoDB的操作简单封装

使用MongoDB的Go驱动库mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create...

XAF学习笔记之 Upcasting

https://www.cnblogs.com/foreachlife/p/xpoupcasting.htmlXAF学习笔记之 Upcasting 通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下: 业务对象代码定义如下: using...