C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND

2023-11-05

  C# SuperSocket 手把手教你入门 傻瓜教程系列教程

C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据)

C# SuperSocket 手把手教你入门 傻瓜教程---2(服务器和客户端双向通信)

C# SuperSocket 手把手教你入门 傻瓜教程---3(Telnet服务器和客户端请求处理)

C# SuperSocket 手把手教你入门 傻瓜教程---4(创建一个服务器和多客户端双向通信程序)

C# SuperSocket 手把手教你入门 傻瓜教程---5(探索自定义AppServer、AppSession,Conmmand,用配置文件App.comfig启动服务器)

C# SuperSocket 手把手教你入门 傻瓜教程---6(CommandLineProtocol---命令行协议)

 C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义CommandLineProtocol---命令行协议)

 C# SuperSocket 手把手教你入门 傻瓜教程-8(TerminatorReceiveFilter - 结束符协议)

C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND

目录

一、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目

二、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

2、安装SuperSocket

3、安装SuperSocket.Engine

三、自定义AppSession类

1、工程项目中添加一个自定义类CountSpliterReceiveFilterSession类

2、CountSpliterReceiveFilterSession类完整的代码如下:

四、自定义AppServer类

1、工程项目中添加一个自定义类CountSpliterReceiveFilterServer

 2、CountSpliterReceiveFilterServer类完整的代码如下:

五、使用Command

1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。

2、LOGIN类完整的代码如下: 

六、program.cs

七、配置App.config使用BootStrap启动SuperSocket

1、SuperSocket配置section 

2、Server实例的配置 

八、验证

九、源程序

十、致谢


        SuperSocket内置的常用协议实现模版如下:

TerminatorReceiveFilter (SuperSocket.SocketBase.Protocol.TerminatorReceiveFilter, SuperSocket.SocketBase)
CountSpliterReceiveFilter (SuperSocket.Facility.Protocol.CountSpliterReceiveFilter, SuperSocket.Facility)
FixedSizeReceiveFilter (SuperSocket.Facility.Protocol.FixedSizeReceiveFilter, SuperSocket.Facility)
BeginEndMarkReceiveFilter (SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter, SuperSocket.Facility)
FixedHeaderReceiveFilter (SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter, SuperSocket.Facility)

        这一篇文章我们实现CountSpliterReceiveFilter - 固定数量分隔符协议
        有些协议定义了像这样格式的请求 "#part1#part2#part3#part4#part5#part6#part7#",每个请求有7个由 '#' 分隔的部分,这种协议的实现非常简单:

        实现CountSpliterReceiveFilter - 固定数量分隔符协议,我们只需要在自定义AppServer类中实现如下代码即可。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) 
//8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {

        }

一、创建一个CountSpliterReceiveFilter( 固定数量分隔符协议)工程项目

         新建一个SuperSocket服务器项目SuperSocketCountSpliterReceiveFilter,参见下图。

 

二、安装SuperSocket和SuperSocket.Engine 

1、进入【管理NuGet程序包】

        鼠标右键单击【引用】,弹出下拉菜单,在下拉菜单中选中【管理NuGet程序包(N)】

2、安装SuperSocket

(1)、【浏览】选项卡下面的输入框中输入SuperSocket

(2)、过一会下面会出现"SuperSocket  ......下载 v1.6.6.1"

(3)、鼠标点击"SuperSocket  ......下载 v1.6.6.1",右边会出现"版本:最新稳定版1.6.6.1"

(4)、点击"版本:最新稳定版1.6.6.1"右边的【安装】按钮

3、安装SuperSocket.Engine

(1)、鼠标点击"SuperSocket.Engine ",右边会出现"版本:1.6.6.1"

(2)、点击"版本:1.6.6.1"右边的【安装】按钮

三、自定义AppSession类

        AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。

     使用方法:创建自定义类CountSpliterReceiveFilterSession,继承AppSession类并重写AppSession类的方法(注意:一个AppSession对象对应一个连接)

1、工程项目中添加一个自定义类CountSpliterReceiveFilterSession类

 

 2、CountSpliterReceiveFilterSession类完整的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;


namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterSession : AppSession<CountSpliterReceiveFilterSession>
    {
        public override void Send(string message)
        {
            Console.WriteLine("发送消息:" + message);
            base.Send(message);
        }

        protected override void OnSessionStarted()
        {
            //输出客户端IP地址  
            Console.WriteLine(this.LocalEndPoint.Address.ToString());
            this.Send("Hello User,Welcome to SuperSocket Telnet Server!");
        }


        /// <summary>  
        /// 连接关闭  
        /// </summary>  
        /// <param name="reason"></param>  
        protected override void OnSessionClosed(CloseReason reason)
        {
            base.OnSessionClosed(reason);
        }


        protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
        {
            Console.WriteLine($"遇到未知的请求 Key:" + requestInfo.Key + $" Body:" + requestInfo.Body);
            base.HandleUnknownRequest(requestInfo);
        }

        /// <summary>  
        /// 捕捉异常并输出  
        /// </summary>  
        /// <param name="e"></param>  
        protected override void HandleException(Exception e)
        {
            this.Send("error: {0}", e.Message);
        }
    }
}

 

四、自定义AppServer类

        AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

        使用方法:创建自定义类CountSpliterReceiveFilterServer,继承AppServer类并重写AppServer类的方法

1、工程项目中添加一个自定义类CountSpliterReceiveFilterServer

 2、CountSpliterReceiveFilterServer类完整的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {

        }

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

        /// <summary>  
        /// 输出新连接信息  
        /// </summary>  
        /// <param name="session"></param>  
        protected override void OnNewSessionConnected(CountSpliterReceiveFilterSession session)
        {
            base.OnNewSessionConnected(session);
            //输出客户端IP地址  
            Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
        }


        /// <summary>  
        /// 输出断开连接信息  
        /// </summary>  
        /// <param name="session"></param>  
        /// <param name="reason"></param>  
        protected override void OnSessionClosed(CountSpliterReceiveFilterSession session, CloseReason reason)
        {
            base.OnSessionClosed(session, reason);
            Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
        }

    }
}

        我们只需要在自定义AppServer类(CountSpliterReceiveFilterServer)中实现如下代码即可实现CountSpliterReceiveFilter - 固定数量分隔符协议。

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketEngine;
using SuperSocket.Facility.Protocol;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class CountSpliterReceiveFilterServer:AppServer<CountSpliterReceiveFilterSession>
    {
        /// 请求格式:#part1#part2#part3#part4#part5#part6#part7#
        public CountSpliterReceiveFilterServer()
           : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) //8个分隔符,7个参数。除使用默认的过滤工厂,还可以参照上一个实例定制协议
        {

        }

警告: 自定义类CountSpliterReceiveFilterServer创建在根目录下,因此完整的路径是:

SuperSocketCountSpliterReceiveFilter.CountSpliterReceiveFilterServer

五、使用Command

         在SuperSocket中的Command让我们进行扩展,使用方法也极其简单。只需要继承一个CommandBase<AppSession, StringRequestInfo>类。(注意:如果使用了自定义的Session,需要修改此处,如LOGIN类下的LOGIN:CommandBase<SocketSession, StringRequestInfo>)类),并override这个类ExecuteCommand方法。

1、工程项目中添加一个自定义类LOGIN,处理Key为"LOGIN"的请求。

2、LOGIN类完整的代码如下: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketBase.Command;

namespace SuperSocketCountSpliterReceiveFilter
{
    public class LOGIN : CommandBase<CountSpliterReceiveFilterSession, StringRequestInfo>
    {
        /// <summary>  
        /// 自定义执行命令方法,注意传入的变量session类型为MySession  
        /// </summary>  
        /// <param name="session">会话</param>  
        /// <param name="requestInfo">请求数据信息</param>  
        public override void ExecuteCommand(CountSpliterReceiveFilterSession session, StringRequestInfo requestInfo)
        {
            session.Send(string.Format("LOGIN {0}:{1} {2}", session.Config.Ip, session.Config.Port, requestInfo.Body));
        }
    }

}

六、program.cs

        在program.cs类中改为使用App.config文件配置,用BootStrap启动服务器。

        警告:要想使用BootStrap启动服务器,必须引用

using SuperSocket.SocketEngine;

 program类完整的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using SuperSocket.Common;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using SuperSocket.SocketEngine;


namespace SuperSocketCountSpliterReceiveFilter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请按任何键进行启动SuperSocket服务!");
            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;
            }

            //停止服务
            bootstrap.Stop();
            Console.WriteLine("服务已停止!");
            Console.ReadKey();


        }
    }
}

七、配置App.config使用BootStrap启动SuperSocket

1、SuperSocket配置section 

        SuperSocket使用.NET自带的配置技术,SuperSocket有一个专门的配置Section,使用配置启动SuperSocket可以灵活配置选项。
 

 <configSections>
    <!--log 日志记录-->
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
    <!--SocketEngine-->
    <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  </configSections>

2、Server实例的配置 

  <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  <!--name: 实例名称
      serverType: 实例运行的AppServer类型
      ip: 侦听ip
      port: 侦听端口-->
  <superSocket>
    <servers>
      <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
      <server name="SuperSocketCountSpliterReceiveFilter" 
       textEncoding="gb2312" 
       serverType="SuperSocketCountSpliterReceiveFilter.CountSpliterReceiveFilterServer,SuperSocketCountSpliterReceiveFilter"
       ip="Any"
       port="2017"
       maxConnectionNumber="100">
      </server>
    </servers>
  </superSocket>

这里解释一下配置的服务器节点:

name: 实例名称(工程项目的解决方案名称:SuperSocketCountSpliterReceiveFilter)

serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【CountSpliterReceiveFilterServer】,它创建在根目录下,因此的完整路径为:SuperSocketCountSpliterReceiveFilter.CountSpliterReceiveFilterServer)

ip: 侦听ip

port: 侦听端口

name: 实例名称  --->  SuperSocketCountSpliterReceiveFilter
serverType:         --->  SuperSocketCountSpliterReceiveFilter.CountSpliterReceiveFilterServer
ip: 侦听ip             --->  Any
port: 侦听端口     ---> 2017

完整的App.config配置文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <!--log 日志记录-->
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
    <!--SocketEngine-->
    <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine"/>
  </configSections>


  <!--服务信息描述,在window服务模式下的名称标识-->
  <appSettings>
    <add key="ServiceName" value="SuperSocketCountSpliterReceiveFilter"/>
    <add key="ServiceDescription" value="霸王猫"/>
  </appSettings>


  <!--SuperSocket服务配置信息 serverType是项目的服务如我自定义的Socketserver-->
  <!--name: 实例名称
      serverType: 实例运行的AppServer类型
      ip: 侦听ip
      port: 侦听端口-->
  <superSocket>
    <servers>
      <!--textEncoding 编码方式"gb2312","utf-8" 默认是acii-->
      <server name="SuperSocketCommandLineProtocol"
       textEncoding="gb2312"
       serverType="SuperSocketCountSpliterReceiveFilter.CountSpliterReceiveFilterServer,SuperSocketCountSpliterReceiveFilter"
       ip="Any"
       port="2017"
       maxConnectionNumber="100">
      </server>
    </servers>
  </superSocket>


  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

八、验证

1、启动服务器

        服务器启动成功。

2、启动客户端

3、连接客户端

        连接客户端后,客户端收到服务器发送的信息:“Hello User,Welcome to SuperSocket Telnet Server!”

4、客户端发送字符串“#LOGIN#part1#part2#part3#part4#part5#part6#"

       警告:由于我们使用了COMMAND,KEY关键字为LOGIN(创建了LOGIN类),因此发送字符串时,第1个#和第2个#之间的字符串,必须为LOGIN。

       警告:由于使用了CountSpliterReceiveFilter - 固定数量分隔符协议,因此KEY和BODY之间的分隔符为#,参数之间的分隔符也为#,而且字符串结尾不需要添加回车换行符\r\n

 为了更好理解和明白,我们看一下调试的参数:

九、源程序

源程序参见如下链接:

C#SuperSocket手把手教你入门傻瓜教程-9(CountSpliterReceiveFilter-固定数量-C#文档类资源-CSDN文库

开发工具为:Visual Studio 2017 

源程序中包含SocketTool.exe TCP&UPD测试工具

 

十、致谢

SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例 - 黄昏前黎明后 - 博客园 (cnblogs.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND 的相关文章

  • shell执行Oracle SQL并捕获异常案例分析

    一 shell脚本 实现功能读取指定配置文件中的Oracle数据库连接 清空传入变量表的数据 以及清除数据之后的结果进行捕获分析 bin bash Created Date 2022 12 16 Author Last Modified 2
  • db2错误代码

    DB2错误代码 SQL返回码信息对照 用COBOL链接DB2时 出现DB2错误信息时 如果你不懂代码是什么意思 可以用这份资料查找 当然你也可以直接在db2的命令行下输入 db2 SQL30081N 系统会给出一些提示信息 sqlcode
  • LiDAR SLAM的比较

    在自动驾驶领域 定位是很重要的一环 为了建立更有鲁棒性 精确的定位 在实际自动驾驶车上往往都会使用激光雷达 激光雷达相比于摄像头 对光照变化不敏感 适合白天和黑夜 绝大多数路况 激光雷达获得的距离信息精度很高 获取的feature很稳定 当
  • Spring 异常处理的三种方式 整理

    异常处理方式一 ExceptionHandler 异常处理方式二 实现HandlerExceptionResolver接口 异常处理方式三 ControllerAdvice ExceptionHandler 三种方式比较说明 强烈推荐各位看
  • 小程序接入微信客服

    wx openCustomerServiceChat Object object 微信开放文档 微信小程序打开微信客服 接口文档 企业微信开发者中心 1 网页搜索 微信客服 扫码登录 根据提示 填写信息 微信客服 2 在 微信客服 中进入企
  • 项目打包报不能在脱机状态下访问**资源

    项目场景 springboot项目 使用maven进行打包操作 问题描述 Failed to execute goal org springframework boot spring boot maven plugin 2 5 0 repa
  • UE4_UStruct 遍历

    一个结构体中存在一个Val变量 Val变量的类型是FVector4 想从c 层面去遍历获得Val的值 上图是很早之前的一个Property继承关系图 当然 在4 25UProperty被FProperty夺笋 好处呢 见下 没有继承UObj

随机推荐

  • etcd的使用

    启动etcd服务 启动etcd时最主要的是需要准备两个没有使用过的端口 这两个端口一个用于etcd之间同步信息 一个用于etcd向客户端提供服务的端口 因此启动单个etcd节点 只需按照如下命令行输入即可 server name myetc
  • sigmoid & logistic

    1 吴恩达老师视频中说sigmoid函数就是logistic函数 2 查阅复旦大学邱锡鹏老师关于深度学习的书 在第四章中写道 Sigmoid型函数是指一类S型曲线函数 为两端饱和函数 常用的Sigmoid型函数有Logistic函数和Tan
  • OpenPose笔记——windows 10下,自编译openpose代码(vs下能跑了,pythonAPI也能使了)

    简直太可怕了 遇到N多的问题 我觉有必要写下来记录一下 我自己编译了四五天 编译了10几次 夭寿哦 缺好多好多东西 给大家讲一下具体步骤 一 准备工作 准备工作当然是各种环境 1 至少VS2015 以上的版本 2 CMake Gui 注意
  • 问题定义过程

    问题定义过程由四步组成 确立需求 证明需求 理解问题和它的上下文和问题陈述 这个模型的主要优点是能够帮助你确定和理解问题的细节 帮助你了解组织的使命和战略在问题解决过程中的的重要性 从这里你可以确定问题是否值得努力寻求解决方案 只有明白了问
  • 自顶向下 逐步求精

    将复杂的大问题分解为相对简单的小问题 找出每个问题的关键 重点所在 然后用精确的思维定性 定量地去 描述问题 其核心本质是 分解 自顶向下 top down 的分析算法通过在最左推导中描述出各个步骤来分析记号串输入 之所以称这样的算法为自顶
  • 埋点系统:详解设计埋点过程中的“who when where how what”

    上次写了一篇 如何用数据驱动产品迭代 其中提到了一点设计埋点的方法 很多朋友留言说需要设计埋点的指南 像我这种从来不拒需求的人 这两天下班闲下来之后就整理了一下埋点设计的一些知识 希望能有所帮助 在诸多招聘 JD 中提到的数据分析能力 主要
  • 使用raspberry pi pico 制作红绿灯

    需要的东西 一块面包版 一块raspberry pi pico 红绿黄led灯各一颗 220欧电阻3只 若干线 编程软件 thonny 操作系统 deepin 23 结果展示 使用raspberry pi pico 制作红绿灯 from m
  • 金山云服务器异常,金山云-文档中心-金山云告诉你:找不到服务器或dns错误怎么办...

    我们在用电脑 会经常使用浏览器 不少人经常在浏览网页时候突然跳出一个提示 上面显示 找不到服器 或 dns错误 下面 给大家分享找不到服务器或dns错误的解决经验 1 病毒所致 如果你电脑中了病毒 让你的DNS被劫持 比如自己的浏览器主页被
  • 【毕业设计】基于PLC的十字路口交通灯控制系统设计【仿真+源码+论文】

    摘 要 本次设计的课题是基于PLC的十字路口交通灯控制系统设计 传统的十字路口交通灯多采用单片机集成电路作为控制系统 单片机系统虽然在功能上能够实现十字路口交通灯的各种控制需求 但是单片机控制系统在设计时需要数字电路与模拟电路的完美结合 这
  • 基于跳表实现的轻量级KV存储引擎 项目总结

    参考 https github com youngyangyang04 Skiplist CPP 项目介绍 KV存储引擎 众所周知 非关系型数据库redis 以及levedb rockdb其核心存储引擎的数据结构就是跳表 本项目就是基于跳表
  • 5.0 Vue中使用webpack

    文章目录 webpack的基本使用 webpack中的插件 webpack打包发布 Source Map 注意 在实际开发中我们并不需要自己配置 webpack webpack中 的用法 在Chrome浏览器中安装vue devtools调
  • QT书籍分享——最全资料汇总

    QT从入门到精通 学习路线 市面上QT学习的书籍也挺多的 今天从学习路径上给大家一一盘点一下 并附上相关链接 大家可以根据需求下载哦 1 语言基础学习 学习QT最最最基础的当然是语言学习了 可以选择C 语言 也可以选择Python语言 C
  • 佛祖保佑,永无bug——springboot项目启动图案的修改方法

    在resources目录 与application yml文件同级目录 下创建banner txt文件 将下面的代码复制进去就好了 AnsiColor BRIGHT YELLOW ooOoo o8888888o
  • 动态规划-各种题型及思路整理(自用笔记,大神绕道)

    目录 简介 分类 基本思想 基本思路 状态转移方程 适用条件 一句话总结 应用 前缀和思想 简介 动态规划 dynamic programming 简称dp 是运筹学的一个分支 是求解决策过程 decision process 最优化的数学
  • 21天学习挑战赛——Python操作MySQL和SqlServer

    目录 1 pymysql模块 2 pymysql模块使用说明 2 1 pymysql操作流程图 2 2 创建连接对象 2 3 获取游标对象 2 4 用法举例 2 4 1 获取一条数据 6 4 2 获取多条数据 6 4 3 对数据进行增删改操
  • 未来社交媒体的变革者

    近日 Meta宣布了其认可的七大社交媒体趋势 这些趋势代表了未来社交媒体发展的核心方向 这些趋势中 生成式AI AR VR营销等引人注目的技术入选 预示着我们即将迎来全新的社交媒体时代 一 生成式AI 像人一样理解并回应 近年来 生成式AI
  • linux 非root用户 安装pyscipopt

    前提 实验室的服务器 我没有root权限 1 尝试用conda方法onda install channel conda forge pyscipopt 出现未知错误 搜遍百度谷歌stackoverflow都没有找到有人和我一样的问题 不知道
  • 基于Java的贪吃蛇小游戏

    一 开发思路 设定一个一定大小的且大小不可变的游戏窗口 在创建的窗口上绘制游戏的基本面板样式 使用提前保存的素材图标绘制一条静态的小蛇 使小蛇能够移动 实际只需蛇头坐标移动 每节身体覆盖前一节身体坐标 设置定时器Timer timer ne
  • Java的异常处理机制

    一 什么是java异常 java异常指在程序运行时可能出现的一些错误 如 文件找不到 网络连接失败 非法参数等 异常是一个事件 它发生在程序运行期间 中断了正在执行的程序的正常指令流 Java通过API中Throwable类的众多子类描述各
  • C# SuperSocket 手把手教你入门 傻瓜教程---9(CountSpliterReceiveFilter - 固定数量分隔符协议)使用COMMAND

    C SuperSocket 手把手教你入门 傻瓜教程系列教程 C SuperSocket 手把手教你入门 傻瓜教程 1 服务器单向接收客户端发送数据 C SuperSocket 手把手教你入门 傻瓜教程 2 服务器和客户端双向通信 C Su