一、需求场景

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

二、所需软件

(1)SocketTool

三、实现步骤

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

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

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

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

 using SuperSocket.SocketBase;
using System;
using System.Text;
using SuperSocket.SocketBase.Protocol; namespace SuperSocketBlog
{
public class SocketSession : AppSession<SocketSession>
{
public override void Send(string message)
{
Console.WriteLine("发送消息:" + message);
base.Send(message);
} protected override void OnSessionStarted()
{
Console.WriteLine("Session已启动");
base.OnSessionStarted();
} protected override void OnInit()
{
this.Charset = Encoding.GetEncoding("gb2312");
base.OnInit();
} protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
{
Console.WriteLine("遇到未知的请求");
base.HandleUnknownRequest(requestInfo);
}
}
}

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

 using SuperSocket.SocketBase;
using System;
using SuperSocket.SocketBase.Config; namespace SuperSocketBlog
{
public class SocketServer : AppServer<SocketSession>
{
protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
{
Console.WriteLine("正在准备配置文件");
return base.Setup(rootConfig, config);
} protected override void OnStarted()
{
Console.WriteLine("服务已开始");
base.OnStarted();
} protected override void OnStopped()
{
Console.WriteLine("服务已停止");
base.OnStopped();
}
protected override void OnNewSessionConnected(SocketSession session)
{
Console.WriteLine("新的连接地址为" + session.LocalEndPoint.Address.ToString() + ",时间为" + DateTime.Now);
base.OnNewSessionConnected(session);
}
}
}

  (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

 using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
using System; namespace SuperSocketBlog
{
public class Apply:CommandBase<SocketSession,StringRequestInfo>
{
public override void ExecuteCommand(SocketSession session, StringRequestInfo requestInfo)
{
//根据参数个数或者其他条件判断,来进行一些自己的操作
if (requestInfo.Parameters.Length==)
{
Console.WriteLine("调用成功");
session.Send("已经成功接收到你的请求\r\n");
}
else
{
session.Send("参数不正确\r\n");
}
}
}
}

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

             #region 初始化Socket
IBootstrap bootstrap = BootstrapFactory.CreateBootstrap();
if (!bootstrap.Initialize())
{
Console.WriteLine(DateTime.Now + ":Socket初始化失败\r\n");
return;
} var result = bootstrap.Start();
foreach (var server in bootstrap.AppServers)
{
if (server.State == ServerState.Running)
{
Console.WriteLine(DateTime.Now + ":serverName为:" + server.Name + "Socket运行中\r\n");
Console.Read();
}
else
{
Console.WriteLine(DateTime.Now + ":serverName为:" + server.Name + "Socket启动失败\r\n");
}
}
#endregion

四、测试

  (1)初始化界面

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

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

(4)使用Apply命令效果图

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

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

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

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

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

最新文章

  1. replace和replaceAll
  2. Linux收集
  3. directly receive json data from javascript in mvc
  4. 树状数组 + 位运算 LA 4013 A Sequence of Numbers
  5. Kosaraju 算法
  6. [转载]C#多线程学习(一) 多线程的相关概念
  7. Building a Space Station
  8. Eclipse 配置Tomcat启动参数 Java EE IDE for Web Developers. Version: Helios Service Release 2
  9. 动态添加Redis密码认证
  10. vue-cli脚手架npm相关文件解读(7)dev-server.js
  11. The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator
  12. python+OpenCV 特征点检测
  13. python timeit模块用法
  14. selenium自动化测试原理和设计的分享
  15. Logistic Loss的简单讨论
  16. V$SQLAREA
  17. 当爬虫遇到js加密
  18. iPhone开发之在UINavigationBar上使用UISegmentedControl制作
  19. [AaronYang风格]微软Unity2.X系统学习笔记,记录
  20. php multicast多播实现详解

热门文章

  1. AI-图像基础知识-01
  2. PAT 乙级 1032.挖掘机技术哪家强 C++/Java
  3. Java精通并发-Condition编程模式详解与分析
  4. JDOJ 2175: 忠诚2
  5. .Net反射-TypeDescriptor
  6. RabbitMQ消息幂等性问题
  7. hadoop java.nio.channels.ClosedChannelException
  8. apply() 函数家族介绍
  9. python 项目实战之Django 邮件发送
  10. shell脚本监控k8s集群job状态,若出现error通过触发阿里云的进程监控报警