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

news2024/11/18 1:45:18

 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(SuperSocket内置的命令行协议) 

目录

一、 SuperSocket提供的通信协议

二、命令行协议CommandLineProtocol

        1、SuperSocket命令行协议定义了每个请求必须以回车换行符( "\r\n")结尾。

        2、SuperSocket命令行协议将接收到的数据翻译成StringRequestInfo 实例。

        3、SuperSocket 内置的命令行协议用空格来分割请求的Key和参数部分。

        4、SuperSocket 内置的命令行协议的参数部分用空格来分割。

三、创建一个支持命令行协议的工程项目

四、安装SuperSocket和SuperSocket.Engine 

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

2、安装SuperSocket

3、安装SuperSocket.Engine

 五、自定义AppSession类

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

​编辑

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

六、自定义AppServer类

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

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

七、使用Command

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

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

八、program.cs

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

1、SuperSocket配置section 。

2、Server实例的配置     

十、验证

十一、源程序

十二、致谢:


        构建一个网络应用程序, 仅仅使用 TCP 还是 UDP 是远远不够的。 因为TCP 和 UDP 是传输层协议。定义了传输层协议是不能让网络的两端进行通信的。需要定义应用层通信协议把接收到的二进制数据转化成你程序能理解的请求。

        Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包和分包就难以避免,而用SuperSocket提供的通信协议就完美的避免了上述情况的发生。

一、 SuperSocket提供的通信协议

        SuperSocket提供以了下几种应用层通信协议。 

  • CommandLineProtocol---命令行协议(默认内置)
  • 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)---头部格式固定并包含内容长度协议

        什么是默认内置当你不定义应用层通信协议,直接用AppSession.Send()方法发送字符串进行服务器和客户端双向通信,SuperSocket就默认启用命令行协议CommandLineProtocol。

       下图的代码,你不定义应用层通信协议,直接用AppSession.Send()方法发送字符串进行服务器和客户端双向通信,SuperSocket就默认启用命令行格式的协议CommandLineProtocol进行通信。

static void appServer_NewSessionConnected(AppSession session)
{
    session.Send("Welcome to SuperSocket Telnet Server!");
}

二、命令行协议CommandLineProtocol

        命令行协议是一种被广泛应用的协议。一些成熟的协议如 Telnet, SMTP, POP3 和 FTP 都是基于命令行协议的。

        在SuperSocket 中,如果我们没有自定义应用层协议的话,SuperSocket默认的协议就是命令行协议 ,这样就极大的简化了基于此类协议的开发

        1、SuperSocket命令行协议定义了每个请求必须以回车换行符( "\r\n")结尾。

        2、SuperSocket命令行协议将接收到的数据翻译成StringRequestInfo 实例。

        SuperSocket设计了两个RequestInfo类StringRequestInfoBinaryRequestInfo。其中StringRequestInfo用于字符串实例,BinaryRequestInfo用于二进制实例。如果我们在SuperSocket中使用命令行协议,所有接收到的数据都会翻译成 StringRequestInfo实例(字符串实例)。我们来看一下StringRequestInfo的定义:

public class StringRequestInfo 
{
     public string Key { get; }
     public string Body { get; }
     public string[] Parameters { get; }
/* Other properties and methods */
}

        StringRequestInfo有三个属性, Key是这个命令行协议的命令名,用于关联Command的字符串;Body是一个命令的参数部分;Parameters是一个命令的参数列表。

        3、SuperSocket 内置的命令行协议用空格来分割请求的Key和参数部分。

        SuperSocket内置的命令行协议用空格来分割请求的Key和参数部分,因此当客户端发送如下数据到服务器端时

"LOGIN kerry 123456" + 回车换行符

        服务器将会收到一个StringRequestInfo 实例,这个实例的属性为:

Key: "LOGIN"
Body: "kerry 123456";
Parameters: ["kerry", "123456"]

        同时定义 "LOGIN" 的命令,这个命令的 ExecuteCommand 方法将会被执行,服务器所接收到的StringRequestInfo实例也将作为参数传给这个方法。

public class LOGIN : CommandBase<AppSession, StringRequestInfo>
{
    public override void ExecuteCommand(AppSession session, StringRequestInfo requestInfo)
    {
      
    }
}

         4、SuperSocket 内置的命令行协议的参数部分用空格来分割。

        SuperSocket内置的命令行协议的参数部分用空格来分割,因此当客户端发送如下数据到服务器端时:

"LOGIN kerry 123 456 789" + 回车换行符

         服务器将会收到一个StringRequestInfo 实例,这个实例的属性为:

Key: "LOGIN"
Body: "kerry 123 456 789";
Parameters: ["kerry", "123", "456", "789"]

其中:Parameters[0]="kerry",Parameters[1]="123",Parameters[2]="456",Parameters[3]="789"

       

下面我们创建一个命令行协议的项目验证SuperSocket 内置的命令行协议CommandLineProtocol

三、创建一个支持命令行协议的工程项目

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

 

四、安装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 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。

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

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

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

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 SuperSocketCommandLineProtocol
{
    /// <summary>  
    /// 自定义连接类SocketSession,继承AppSession,并传入到AppSession  
    /// </summary>  
    public class SocketSession : AppSession<SocketSession>
    {
        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实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

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

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

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

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 SuperSocketCommandLineProtocol.Config
{
    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();
        }

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

}

警告: 自定义类SocketServer创建在文件夹Config下,因此完整的路径是:

SuperSocketCommandLineProtocol.Config

七、使用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 SuperSocketCommandLineProtocol
{
    public class LOGIN : CommandBase<SocketSession, StringRequestInfo>
    {
        /// <summary>  
        /// 自定义执行命令方法,注意传入的变量session类型为MySession  
        /// </summary>  
        /// <param name="session">会话</param>  
        /// <param name="requestInfo">请求数据信息</param>  
        public override void ExecuteCommand(SocketSession 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 SuperSocketCommandLineProtocol
{
    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="SuperSocketCommandLineProtocol" 
       textEncoding="gb2312" 
       serverType="SuperSocketCommandLineProtocol.Config.SocketServer,SuperSocketCommandLineProtocol"
       ip="Any"
       port="2017"
       maxConnectionNumber="100">
      </server>
    </servers>
  </superSocket>

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

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

serverType: 实例运行的AppServer类型(就是之前我们创建的自定义AppServer类【SocketServer】,它创建在Config文件夹下,因此的完整路径为:SuperSocketCommandLineProtocol.Config.SocketServer

ip: 侦听ip

port: 侦听端口

name: 实例名称  --->  SuperSocketCommandLineProtocol
serverType:         --->  SuperSocketCommandLineProtocol.Config.SocketServer
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="SuperSocketCommandLineProtocol"/>
    <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="SuperSocketCommandLineProtocol.Config.SocketServer,SuperSocketCommandLineProtocol"
       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 kerry 123 456 789”+回车换行符

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

         服务器收到一个StringRequestInfo 实例,这个实例的属性为:

Key: "LOGIN"
Body: "kerry 123 456 789";
Parameters: ["kerry", "123", "456", "789"]

其中:

        Parameters[0]="kerry",

        Parameters[1]="123",

        Parameters[2]="456",

        Parameters[3]="789"

十一、源程序

        源程序参见如下链接:

(11条消息) C#SuperSocket手把手教你入门傻瓜教程-6(SuperSocket内置的命令行协议)-C#文档类资源-CSDN文库

        开发工具为:Visual Studio 2017 

十二、致谢:

SuperSocket入门(四)-命令行协议 - 黄昏前黎明后 - 博客园 (cnblogs.com)

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

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

相关文章

No.1 初步认识Vue2.0

目录一、准备工作二、简单使用Vue2.1 初步使用Vue绑定2.2 Vue中数据绑定&#xff08;用于表单元素&#xff0c;即有value属性的元素&#xff09;2.2.1 单向数据绑定2.2.2 双向双向数据绑定2.2.3 数据绑定的简写2.3 Vue中el与data的两种书写方式2.3.1 el的写法——方式一2.3.2 e…

流体力学课上的老师这句话,让我义无反顾的上了CFD这艘“贼船”

CAE&#xff08;Computer Aided Engineering&#xff09;&#xff1a;利用计算机辅助求解分析复杂工程和产品的结构力学性能并进行优化&#xff0c;涵盖的分析对象包括结构、流体、热、电磁等。在工业4.0和中国制造2025大趋势下&#xff0c;CAE技术已上升为国家战略&#xff0c…

葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI)|A54修饰葡聚糖-PLGA嫁接物胶束

葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI)|A54修饰葡聚糖-PLGA嫁接物胶束 葡聚糖修饰线性聚乙烯亚胺(Dex-SS-LPEI) 产品描述&#xff1a;通过二硫吡啶端基化的线性聚乙烯亚胺(LPEI-SSPy,M_n5 000)与巯基化葡聚糖(Dex-SH,Mw5 000)的偶联反应,制备出生物还原响应的葡聚糖基线…

基于数字孪生概念,开启精细化城市管理模式

一座城市囊括森罗万象&#xff0c;各个领域的数据资源繁冗复杂&#xff0c;政务、经济、民生等问题层出不穷&#xff0c;管理者基本上很难对整座城市进行统一管理。由此&#xff0c;业内提出了“智慧城市”的概念。 最开始的时候&#xff0c;智慧城市可视化仅仅停留在把数据图形…

集成Springboot+Prometheus+Grafana

Springboot pom.xml导入prometheus依赖 <!--prometheus--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>io.mi…

Docker——DockerCompose简单使用

目录 一、DockerCompose 1.1 基本介绍 1.2 Centos7安装DockerCompose 1.2.1 安装 1.2.2 修改文件权限 1.2.3 Base自动补全命令 二、部署微服务集群 一、DockerCompose 1.1 基本介绍 DockerCompose&#xff1a;可以基于Compose文件帮我们快速部署分布式应用&#xff0c;而…

Mysql int(11)和Oracles nubmer(11) 的区别

先说Mysql int(11)到底代表什么意思 这里的int(11)不是表示限制int的长度为11&#xff0c;而是字符的显示宽度&#xff0c;在字段类型为int时&#xff0c;无论你显示宽度设置为多少&#xff0c;int类型能存储的最大值和最小值永远都是固定的 那么这个显示宽度到底有什么用呢&am…

vue项目中,js代码动态控制网页的link标签与title内容

最近正在开发一个微模块系统&#xff0c;产品想要根据子系统的不同&#xff0c;动态生成link标签与title中的内容&#xff0c;于是就做了一个简单的demo&#xff0c;希望分享出来给到后续有同样需求的伙伴&#xff0c;共勉。 首先肯定是需要有一套**.svg**的图标来对应相应的系…

Blender 纹理绘制

文章目录简介.进入纹理绘制.笔刷.自由线.模糊.涂抹.克隆.填充.遮罩.保存绘制好的纹理.简介. 1 纹理绘制允许我们直接在图片上画出图案 2 要求模型必须已经展开UV 进入纹理绘制. 1 左上角视窗类型里选择 3D视图/纹理绘制 笔刷. 自由线. 1 纹理&#xff1a;如果使用的是程…

Docker[6]-.DockerCompose

1 DockerCompose介绍 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 一键启动所有的服务 Docker…

MySQL基础知识

一、数据库相关的简单命令 1、显示数据库 show databases&#xff1b; 2、创建数据库 create database 数据库名 character set 字符集 collate 指定字符集的校验规则&#xff1b; 注意&#xff1a; 数据库名应尽量避免使用关键字&#xff0c;如必须使用则需添加(倒引号);未…

欧洲的历史都经历了哪些时代?

欧洲历史起源于古希腊和罗马&#xff0c;后面分化出了法、意、德&#xff1b;经过罗马时代中世纪时期的黑暗后&#xff0c;欧洲觉醒出现文艺复兴&#xff0c;使欧洲开启了巨大的创造力。后面的大航海时代欧洲开始向外拓展势力范围&#xff0c;疯狂殖民&#xff0c;英国成为最大…

初级测试工程师(能找到工作的水平就行)1、学多久2、学什么?

看到这个主题&#xff0c;我认为自己还有点发言权吧。 我是普通二本院校的垫底学渣&#xff0c;全班成绩倒数第三&#xff0c;并且还是非计算机专业。现在毕业2年&#xff0c;从销售岗位跨越式跳槽软件测试岗。当然我的薪资也已逆袭&#xff0c;从2k到17k。 踩过不少新手的坑…

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

数据库设计(一)

目录 数据库设计的基本概念&#xff1a; 数据库设计包括以下几个部分&#xff1a; 需求设计&#xff1a; 1、数据&#xff1a; 2、处理&#xff1a; 概念结构设计&#xff1a; 实体&#xff1a; 例如&#xff1a; 联系类型&#xff1a; 1、一对一&#xff1a; 2、一对多&a…

Hbase和Mysql存储数据量对比

目录 前言 生成数据 转换成hbase能够识别的HFile文件 导入HFile到hbase中 导入数据到Mysql 总结 前言 由于想知道hbase和mysql存储同样的一份数据需要的存储是否一样&#xff0c;故做的一下实验。 生成数据 脚本如下&#xff1a; #!/bin/basharray_brand([1]huawei […

Java-MySQL

数据库基础知识 先谈发音 MySQL如何发音&#xff1f;在国内MySQL发音有很多种&#xff0c;Oracle官方文档说他们念作My sequal[si:kwəl]。 数据库基本概念 1 ● 数据 数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、…

目标检测算法——人脸识别数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批人脸识别数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&am…

用python给女朋友写个圣诞树玩玩~

嗨害大家好鸭&#xff01;我是小熊猫~ 虽然我们不过洋节&#xff0c;但是女朋友要的话&#xff0c;那顺手写一个吧 代码&#x1f386; 模块 [源码、资料电子书点击此处] import turtle as t from turtle import * import random as r import time圣诞树细节以及画布大小 画布…

如何读取MySQL中的数据存放到HDFS_大数据培训

大数据培训读取MySQL中的数据存放到HDFS 1 查看官方模板 [atguiguhadoop102 ~]$ python /opt/module/datax/bin/datax.py -r mysqlreader -w hdfswriter { “job”: { “content”: [ { “reader”: { “name”: “mysqlreader”, “parameter”: { “column”: [], “conne…