SuperSocket配置UDP服务器

零、需求

  • 两个设备局域网联机,需要用广播自动搜寻,而SuperSocket1.6的默认AppServer使用的是TCP,但只有UDP才支持广播。

一、解决

  • 推荐小白使用方案二,简单快捷。

1. 方案一:可以通过配置 “App.config” 文件,再使用 “BootstrapFactory” 来启动UDP服务器。(这个是参考了C#SuperSocket的搭建--通过配置启动的)

  • 编写自己的 “Session” 类,我这边随便写写
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SuperSocketTest.src.Service.UDPServer
{
//这边权限要public,不然在接下来的命令类那边是会报错的
public class MySession : AppSession<MySession>
{
protected override void OnSessionStarted()
{
//连接后发送欢迎信息
this.Send("Welcome to SuperSocket Telnet Server");
} protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
{
//无法解析命令提示未知命令
this.Send("Unknow request");
} protected override void HandleException(Exception e)
{
//程序异常信息
this.Send("Application error: {0}", e.Message);
} protected override void OnSessionClosed(CloseReason reason)
{
//连接被关闭时
base.OnSessionClosed(reason);
}
}
}
  • 接着按自己需求定义自己APPServer,这边我也随便写写(自定义的AppServer,在继承AppServer是的Session泛型,记得要更改为我们自定义的Session,这边我的是MySession)
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SuperSocketTest.src.Service.UDPServer
{
class MyServer : AppServer<MySession>
{
//这边Base里留空就是默认的命令行编码和用空格分隔
//这边我把命令与参数之间的分隔符改为“:”,把参数之间的分隔符改为“,”
public MyServer()
: base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
{
} protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
{
return base.Setup(rootConfig, config);
} protected override void OnStopped()
{
base.OnStopped();
}
}
}
  • SuperSocket 中的命令设计出来是为了处理来自客户端的请求的, 它在业务逻辑处理之中起到了很重要的作用。所以我们写一个自己的命令类。(后面好像处理不了,我也不知道怎么回事)
using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SuperSocketTest.src.Service.UDPServer
{
//这边权限要public才能被扫描到,CommandBase的第一个填刚刚自己创建的MySession
public class MyCommand : CommandBase<MySession, StringRequestInfo>
{
public override string Name
{
get
{
//调用命令的名字,如果不覆盖,默认是类名
return "001";
}
} public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo)
{
//向客户端返回信息,已接受到命令
session.Send("Hello,I'm UDP server! The parameter you send is " + requestInfo.Body);
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--下面configSections这项一定是放在configuration里的第一个,不然会报错-->
<configSections>
<section name="superSocket"
type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
</configSections>
<superSocket>
<servers>
<!--serverType中,逗号左边的是你自定义的server在项目中的位置(命名空间加类名),逗号右边是项目名(命名空间的第一个.之前的),ip就是服务器ip(Any代表本机),port端口号,mode:Tcp或者Udp模式-->
<server name="SSTUDP"
serverType="SuperSocketTest.src.Service.UDPServer.MyServer,SuperSocketTest"
ip="Any" port="2020" mode="Udp">
</server>
</servers>
</superSocket>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
  • 最后,主程序中调用Bootstrap启动服务器。
using SuperSocket.SocketBase;
using SuperSocket.SocketEngine;
using System;
using System.Collections.Generic;
using System.Linq; namespace SuperSocketTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("按任意键以启动服务器!"); Console.ReadKey();
Console.WriteLine(); var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize())
{
Console.WriteLine("初始化失败!请检查配置文件!");
Console.ReadKey();
return;
} var result = bootstrap.Start(); Console.WriteLine("启动结果: {0}!", result); if (result == StartResult.Failed)
{
Console.WriteLine("启动失败!");
Console.ReadKey();
return;
} Console.WriteLine("按 ‘q’ 键停止服务器。"); while (Console.ReadKey().KeyChar != 'q')
{
Console.WriteLine();
continue;
} Console.WriteLine(); //关闭服务器
bootstrap.Stop(); Console.WriteLine("服务器已停止!");
Console.ReadKey(); }
}
}
  • 结果:



    -- 成功,这边使用的自定义的命令行格式!

2. 方案二:通过代码的方式启动,这样简单些,但是文档中没有给出方法,在查阅源码后发现,设置启动模式可以在“AppServer”类的“Setup”方法中设置。

using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketEngine;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SuperSocketTest
{
class Program
{
/// <summary>
/// 客户端计数器
/// </summary>
static int clientCount = 0; static void Main(string[] args)
{
Console.WriteLine("按任意键以启动服务器!");
Console.ReadKey();
Console.WriteLine(); var appServer = new AppServer(); //在这设置服务器模式,更多属性请参阅官方文档
if (!appServer.Setup(new ServerConfig
{
Ip = "Any",
Port = 2020,
Mode = SocketMode.Udp
}))//配置服务器
{
Console.WriteLine("配置服务器失败!");
Console.ReadKey();
return;
} Console.WriteLine();
//尝试启动服务器
if (!appServer.Start())
{
Console.WriteLine("启动失败!");
Console.ReadKey();
return;
}
Console.WriteLine("服务器启动成功,按 ‘q’ 键停止服务器!"); //注册新连接
appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);
//注册命令响应
appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived); while (Console.ReadKey().KeyChar != 'q')
{
Console.WriteLine();
continue;
}
//停止服务器
appServer.Stop();
Console.WriteLine("服务器已停止!");
Console.ReadKey();
} /// <summary>
/// 处理第一次连接
/// </summary>
/// <param name="session">socket会话</param>
private static void appServer_NewSessionConnected(AppSession session)
{
clientCount++;
session.Send("Hello,you are the " + clientCount + "th connected client!");
} /// <summary>
/// 处理命令
/// </summary>
/// <param name="session">socket会话</param>
/// <param name="requestInfo">请求的内容,详见官方文档</param>
private static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
{
switch (requestInfo.Key.ToUpper())
{
case ("001")://同样添加一条命令,更多命令的使用请查阅文档
session.Send("Hello,I'm UDP server! The parameter you send is " + requestInfo.Body);
break;
} }
}
}
  • 结果:



    -- 成功!

二、总结

  • 可以通过配置和代码来启动服务器。
  • 代码在AppServer.Setup函数下配置。
  • 文件配置在App.config文件里配置,再通过Bootstrap启动服务器。
  • 对于TCP方式同样适用,只需要设置mode的值为Tcp即可。
  • SuperSocket很棒!怎么三年前没有发现这个宝藏呢!
  • UDP测试 V1软件:UDP收发器 Gitee

谢谢支持

【C#】SuperSocket配置启动UDP服务器的更多相关文章

  1. udp服务器监听(多线程)

    项目一:udp1111 监听的有三个文件分别为: guiHello.java 有关界面和事件响应功能 UdpFunc.java是udp类的封装:发送和接收 udpServer.java是入口函数,无实 ...

  2. C#SuperSocket的搭建--通过配置启动

    之前我们借助一个SuperSocket实现了一个简易版的服务器, 但是不管是Server还是Session都是使用框架的,本篇博客我们要实现自己的Server和Session,来重写框架原生的Serv ...

  3. 转:配置nodemanager启动weblogic服务器

    下面仅供参考,里面表格还有文件目录我是写的linux,刚刚看到原作者是windows, 后面我会把自己配置nodemanager的经过记录上来,我搞得是linux. (一)通过nodemanager本 ...

  4. 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties

     配置受管服务器, 先启动WebLogic服务器,启动方式如下: 在WebLogic控制台中的"开发模式"---"锁定并编辑"模式下,点击"Ser ...

  5. Linux的DNS配置2-主从服务器

    1.实验背景 之前写了Linux的DNS配置1-DNS入门,其中只用了一台DNS服务器,但一般在大型网络中,都要通过配置辅助DNS服务器可以提高DNS服务的可靠性,本次实验即配置DNS主从服务器 2. ...

  6. 在 RHEL/CentOS 7 上配置NTP时间服务器

    一.NTP简介 网络时间协议 - NTP - 是运行在传输层 123 号端口的 UDP 协议,它允许计算机通过网络同步准确时间.随着时间的流逝,计算机内部时间会出现漂移,这会导致时间不一致问题,尤其是 ...

  7. netty学习:UDP服务器与Spring整合(2)

    上一篇文章中,介绍了netty实现UDP服务器的栗子. 本文将会对UDP服务器与spring boot整合起来,并使用RedisTemplate的操作类访问Redis和使用Spring DATA JP ...

  8. nacos 1.4.2 建立集群,公司启动linux服务器常用命令

    2022-7-29 编写micro自动处理脚本,并加入了守护精灵进程 先启动prop1 服务器(xx.1xx.165.186) 再启动prop2服务器 (xx.1xx.174.173) ####### ...

  9. Linux系统安装配置NTP时间服务器

    背景 局域网不能上外网情况下同步集群时间,搭建NTP服务器,并设置其他主机每小时同步时间(假设使用地址为192.168.3.21的主机作为NTP服务器) 安装NTP $ sudo yum instal ...

  10. 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。

    1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...

随机推荐

  1. Kubernetes GPU 虚拟化方案

    主流架构 Device Plugin:K8s制定设备插件接口规范,定义异构资源的上报和分配,设备厂商只需要实现相应的API接口,无需修改kubelet源码即可实现对其他硬件设备的支持. Extende ...

  2. Solution Set -「PTS Simus」“待天地再静默一秒”

    目录 03.11 A. 太阳照常升起 (exam) B. 丧钟为谁而鸣 (exam) C. 老人与海 (exam) 03.12 A. 「计蒜客 #42547」Yuuki and a problem B ...

  3. DevOps 企业级 CI/CD 实战 —— 整合 GitLab+Jenkins+Harbor+Docker 实现代码全自动化流程管理

    前言 随着 AI 人工智能.云计算.Docker.K8S 等容器技术等的发展,DevOps 得到了广泛的应用和推广,CI / CD ( 持续集成 / 持续部署 )等概念不断深化和完善.CI/CD 是现 ...

  4. Java技术栈总结-提升

    1 java基础: 1.1 算法 1.1 排序算法:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序 1.2 二叉查找树.红黑树.B树.B+树.LSM树(分别有对应 ...

  5. A note on the calculation of some functions in finite fields: Tricks of the Trade解读

    本节对该paper进行解读,记录笔记. 经常见到的是在素域\(F_p\)上计算的,尤其是双线性对出现后,在扩域\(F_{p^m}\)上计效率就需要优化了.该论文主要总结了一些在有限域上进行某些计算(求 ...

  6. HashMap的底层实现原理? HashMap 和 Hashtable的异同? 负载因子值的大小,对HashMap有什么影响?

     1. HashMap的底层实现原理 HashMap的底层:数组+链表 (jdk7及之前) 数组+链表+红黑树 (jdk 8)HashMap的底层实现原理?以jdk7为例说明: HashMap map ...

  7. Bottleup pg walkthrough Intermediate

    一开始看到page=view/.html的时候就想到目录穿越了尝试../../../../../../../../../../../etc/passwd 发现不行 找半天其他可能存在漏洞的地方又找不到 ...

  8. 0425-FileRead字符输入流

    package A10_IOStream; import java.awt.datatransfer.StringSelection; import java.io.IOException; impo ...

  9. 11. SpringCloud Alibaba Seata 分布式事务处理的详细使用以及详细剖析

    11. SpringCloud Alibaba Seata 分布式事务处理的详细使用以及详细剖析 先看一个问题,引出 Seata 单机单库(多表)处理事务示意图 分布式微服务架构下的数据库事务示意图: ...

  10. JMeter调用python脚本

    JMeter调用python脚本 前提 具备python环境 具备jdk环境 一.编写python脚本 python脚本如下: import random # 随机一个 1~100 的随机数 prin ...