一、需求场景

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

C# 使用SuperSocket的更多相关文章

  1. 基于SuperSocket的IIS主动推送消息给android客户端

    在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...

  2. supersocket+controller+action

    public class MasterServer : SuperSocket.SocketBase.AppServer<MasterSession> { } public class M ...

  3. 我的第一个Socket程序-SuperSocket使用入门(三)

    本来博客都停了,不打算更了,但今天百度一个socket的问题时无意间发现第一篇的socket文章权重仅次于SuperSocket网站,顿时觉得自己6到不行,再写一篇,讨论下数据持久化的问题 去年搞那个 ...

  4. SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议

    SuperSocket 提供了一些通用的协议解析工具, 你可以用他们简单而且快速的实现你自己的通信协议: TerminatorReceiveFilter (SuperSocket.SocketBase ...

  5. 认识SuperSocket 1.6.4

    SuperSocket 是一个轻量级的可扩展的 Socket 开发框架,由江振宇先生开发,之所以选用它是因为一下几点恰好复合项目需求: 开源,基于Apache 2.0协议,可以免费使用到商业项目. 高 ...

  6. SuperSocket架构设计示意图【转】

    转自:http://docs.supersocket.net/v1-6/zh-CN/Architecture-Diagrams 中文(中国)Toggle Dropdown v1.6Toggle Dro ...

  7. 如何获取supersocket的源代码

    源代码的地址:https://github.com/kerryjiang/SuperSocket 安装git之后,可以使用命令行git clone https://github.com/kerryji ...

  8. supersocket中quickstart文件夹下的MultipleCommandAssembly的配置文件分析

    首先确认下配置文件中的内容 第一部分configSections[需要注意的是name=superSocket] <configSections> <section name=&qu ...

  9. 开源项目SuperSocket的学习笔记

    近几日想在一个项目中引进一个Socket Server,用来接收客户端发送的命令消息并根据具体的业务逻辑对消息进行处理,然后转发给其它在线的客户端.因为以前在博客园关注过江大渔开源的SuperSock ...

  10. 基于SuperSocket实现的WebSocket(后端)

    关于WebSocket其实很早就想发了,奈何之前项目中的WebSocket的后端不是我做的,而我又想前后端都发出来和大家讨论讨论~于是挤出点时间研究了一下WebSocket的后端实现(所以才有了这篇文 ...

随机推荐

  1. windows 桌面文件变成.link解决方案

    在注册表中右键删除下面这个注册表项: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ln ...

  2. 批量部署SSH基于key的验证脚本

    工作中,使用ansible等自动化运维工具实现服务器批量自动化运维管理,需要先解决管理端和被管理端的免密码登录,可以脚本实现ssh基于key的验证,代码如下: #!/bin/bash PASS=123 ...

  3. java static学习

    原创,转载请注明来源sogeisetsu的博客园 static,在类里面定义公共的属性,它可以统一修改,并只占一个内存.从而达到方便修改和少占内存的目的 先放上代码,您可以先越过代码,看后面的讲解内容 ...

  4. 在istio中让prometheus跑起来

    使用microk8s安装,默认的prometheus已就位. 可直接弄. 一,映射本地端口(注意,命令行最后的两个端口,前一个为要映射的本地端口,后一个为POD的服务端口,如果本地相同端口被占用,则要 ...

  5. LOJ 3159: 「NOI2019」弹跳

    题目传送门:LOJ #3159. 题意简述: 二维平面上有 \(n\) 个整点,给定每个整点的坐标 \((x_i,y_i)\). 有 \(m\) 种边,第 \(i\) 种边从 \(p_i\) 号点连向 ...

  6. 201871010109-胡欢欢《面向对象程序设计(java)》第二周学习总结

    开头: 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>     https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地 ...

  7. hive使用beeline配置远程连接

    hive以hadoop集群为基础,提供hdfs的SQL支持: hive一般可以以mysql为元数据存储,默认Derby:hadoop,hive安装自行百度吧: 介绍hive的远程访问: 未配置之前使用 ...

  8. python windows下获取路径时有中文处理

    在windows中用os,path.abspath(__file__)时有中文路径时,默认是转成非unicode格式 这会导致,在其它模块使用该路径时,会报 utf8' codec can't dec ...

  9. 趣味编程:静夜思(C++17 Ranges版)

    #include <iostream> #include <range/v3/all.hpp> #include <vector> #include <loc ...

  10. Python进阶-II 参数陷阱、命名空间、嵌套、作用域、闭包

    一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_a ...