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

news2024/11/18 23:29:42

  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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue 快速入门系列】Vue数据实现本地存储、自定义事件绑定、全局事件总线、$nextTick的使用

文章目录一、本地存储1.概念2.接口3.实际操作二、自定义事件绑定1.自定义事件使用过程2.绑定自定义事件的语法3.其他注意事项三、全局事件总线1.全局事件总线概念2.全局事件总线的使用方式3.原理剖析四、$nextTick小技巧一、本地存储 1.概念 可以将数据临时存储到本地浏览器&…

基于适应度-距离平衡的人工生态系统优化求解暂态稳定约束最优潮流问题附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

数字时代,企业应该如何看待商业智能BI

新一代数字化相关技术的应用&#xff0c;使得数字化产品和服务覆盖了社会的方方面面&#xff0c;也让数据成为了构建现代化社会的核心元素&#xff0c;让人们明白数据不只是人类活动产生的附加品&#xff0c;还能够在应用过程中促进人类活动发展、优化和改变&#xff0c;真正成…

Python时间模块之datetime模块

目录 简介 函数介绍及运用 date&#xff1a;日期类 1.获取当前时间 2.日期对象的属性 3.date类中时间和时间戳的转换&#xff1a; 4.修改日期使用replace方法 time&#xff1a;时间类 time类操作 datetime&#xff1a;日期时间类 timedelta&#xff1a;时间间隔&…

【MySQL常用性能指标】

这里给大家分享一些MySQL的常用性能指标&#xff0c;可以对此增加一些自定义指标到数据库的监控里&#xff0c;如zabbix或者prometheus&#xff0c;来更好的检测数据库的状态。 我的MySQSL版本是5.7.19。因为是自己的测试环境&#xff0c;所以截图的一些指标很低&#xff0c;仅…

[附源码]Python计算机毕业设计SSM基于的考研信息共享平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

linux下故障硬盘点灯操作

按照常理说&#xff0c;硬盘故障了&#xff0c;会自动亮红灯&#xff0c;故障消除后会自动恢复正常&#xff0c;这个本来是服务器自带的功能。但现实情况往往不是这样&#xff0c;即使硬盘故障了&#xff0c;现场通过外观也看不出来。 1 硬盘点灯的意义 在运维的工作中&#…

【电巢】什么是EMC测试?EMC测试又是如何分类的?

在CE认证里面针对不同产品有不同的测试标准、指令&#xff0c;带电产品中必须要测是的EMC指令&#xff0c;作为最常见的CE指令&#xff0c;很多客户想知道什么是EMC测试? EMC的基本定义 EDA365电子论坛 EMC是评价产品质量的一个重要指标。 1.电磁兼容EMC (Electro-Magnetic …

KVM虚拟化

概述 虚拟化是一种技术&#xff0c;可以利用以往局限于硬件的资源来创建有用的 IT 服务。它让您能够将物理计算机的工作能力分配给多个用户或环境&#xff0c;从而充分利用计算机的所有能力。 1.1 工作原理 一种叫做 Hypervisor &#xff08;虚拟机监控程序&#xff09;的软件…

非零基础自学计算机操作系统 第1章 操作系统概述 1.6 操作系统的界面形式 1.7 操作系统的运行机理

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.6 操作系统的界面形式1.6.1 交互终端命令1.6.2 图形用户界面1.6.3 触屏用户界面1.6.4 作业控制语言1.6.5 系统调用命令1.7 操作系统的运行机理第1章 操作系统概述 1.6 操作系统的界面形式 …

mac回收站清空还能恢复吗?苹果电脑删除的文件怎么恢复

mac回收站清空还能恢复吗&#xff1f;通常&#xff0c;我们右键从电脑上删除的文件&#xff0c;都是被保存在回收站的&#xff0c;那么从回收站删除的文件去哪儿了呢&#xff1f; 当文件从回收站删除后&#xff0c;这些文件还保留在电脑系统上面&#xff0c;只是我们没有办法看…

Java性能调优System的gc垃圾回收方法

java性能调优System的gc垃圾回收方法 java性能调优System的gc垃圾回收方法示例解 一、什么是System.gc()&#xff1f; System.gc()是用Java&#xff0c;C&#xff03;和许多其他流行的高级编程语言提供的API。当它被调用时&#xff0c;它将尽最大努力从内存中清除垃圾&#…

ABHD5 调控细胞自噬依赖的嘧啶合成介导结肠癌对5-FU 的药物敏感性改变

​ 发表期刊&#xff1a;Nature Communications 影响因子&#xff1a;12.353 发表时间&#xff1a;2019年 合作单位&#xff1a;第三军医大学附属西南医院 今天百趣代谢组学将给大家分享Nature Communications上的一篇文章&#xff1a;ABHD5 blunts the sensitivity of col…

这 88 道阿里高级岗面试题,刷掉了 80% 以上的 Java 程序员

2022&#xff0c;可谓是招聘面试最难季。不少大厂&#xff0c;如腾讯、字节的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言。今天不谈其它&#xff0c;就说说我作为面试官面试的那些事儿。 从某电商项目…

JVM监控及诊断工具之命令行篇

文章目录1. 概述2. jps&#xff1a;查看正在运行的Java进程3. jstat&#xff1a;查看JVM统计信息4. jinfo&#xff1a;实时查看和修改JVM配置参数5. jmap&#xff1a;导出内存映像文件&内存使用情况6、jhat&#xff1a;JDK自带堆分析工具7 jstack&#xff1a;打印JVM中线程…

基于微信小程序的旅游系统-计算机毕业设计

项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…

_5LeetCode代码随想录算法训练营第五天-C++哈希表

_5LeetCode代码随想录算法训练营第五天-C哈希表 LeetCode 242.有效的字母异位词LeetCode 349.两个数组的交集LeetCode 202.快乐数LeetCode 1.两数之和 本文截图参考代码随想录&#xff1a;https://programmercarl.com/ 哈希表 定义 哈希表是根据键值而直接进行访问的数据结…

shell 创建子进程及并行延时执行命令方法

shell 创建子进程方法 1. 什么是shell子进程 子进程&#xff0c;是从父子进程的概念出发的&#xff0c;unix操作系统的进程从init进程开始&#xff08;init进程为1,而进程号0为系统原始进程&#xff0c;以下讨论的进程原则上不包括进程0)均有其对应的子进程&#xff0c;就算是…

POI通过模板导出excel(包含表头合并处理)

最近接触到比较多poi相关的需求&#xff0c;总结一下通过模板导出以及表头合并的一些复杂情况处理。 简单使用的话可以参考下我之前写的 POI实现导入导出excel 目录&#xff1a;1、POI通过模板导出2、POI表头合并处理1、POI通过模板导出 其实通过模板导出的原理&#xff0c;无…

2021 年年度最佳开源软件

Svelte https://svelte.dev/ Svelte 是一种全新的构建用户界面的方法。传统框架如 React 和 Vue 在浏览器中需要做大量的工作&#xff0c;而 Svelte 将这些工作放到构建应用程序的编译阶段来处理。 与使用虚拟&#xff08;virtual&#xff09;DOM 差异对比不同。Svelte 编写的…