怒肝四个月MySQL源码,我总结出这篇MySQL协议(详尽版,基于c的毕业设计选题

| n | 数据库名称(字符串到达消息尾部时结束,无结束符) |

COM_QUERY 消息报文

功能:最常见的请求消息类型,当用户执行SQL语句时发送该消息。

| 字节 | 说明 |

| — | — |

| n | SQL语句(字符串到达消息尾部时结束,无结束符) |

COM_FIELD_LIST 消息报文

功能:查询某表的字段(列)信息,等同于SQL语句SHOW [FULL] FIELDS FROM ...

| 字节 | 说明 |

| — | — |

| n | 表格名称(Null-Terminated String) |

| n | 字段(列)名称或通配符(可选) |

COM_CREATE_DB 消息报文

功能:创建数据库,该消息已过时,而被SQL语句CREATE DATABASE代替。

| 字节 | 说明 |

| — | — |

| n | 数据库名称(字符串到达消息尾部时结束,无结束符) |

COM_DROP_DB 消息报文

功能:删除数据库,该消息已过时,而被SQL语句DROP DATABASE代替。

| 字节 | 说明 |

| — | — |

| n | 数据库名称(字符串到达消息尾部时结束,无结束符) |

COM_REFRESH 消息报文

功能:清除缓存,等同于SQL语句FLUSH,或是执行mysqladmin flush-foo命令时发送该消息。

| 字节 | 说明 |

| — | — |

| 1 | 清除缓存选项(位图方式存储,各标志位含义如下) |

| | 0x01: REFRESH_GRANT |

| | 0x02: REFRESH_LOG |

| | 0x04: REFRESH_TABLES |

| | 0x08: REFRESH_HOSTS |

| | 0x10: REFRESH_STATUS |

| | 0x20: REFRESH_THREADS |

| | 0x40: REFRESH_SLAVE |

| | 0x80: REFRESH_MASTER |

COM_SHUTDOWN 消息报文

功能:停止MySQL服务。执行mysqladmin shutdown命令时发送该消息。

| 字节 | 说明 |

| — | — |

| 1 | 停止服务选项 |

| | 0x00: SHUTDOWN_DEFAULT |

| | 0x01: SHUTDOWN_WAIT_CONNECTIONS |

| | 0x02: SHUTDOWN_WAIT_TRANSACTIONS |

| | 0x08: SHUTDOWN_WAIT_UPDATES |

| | 0x10: SHUTDOWN_WAIT_ALL_BUFFERS |

| | 0x11: SHUTDOWN_WAIT_CRITICAL_BUFFERS |

| | 0xFE: KILL_QUERY |

| | 0xFF: KILL_CONNECTION |

COM_STATISTICS 消息报文

功能:查看MySQL服务的统计信息(例如运行时间、每秒查询次数等)。执行mysqladmin status命令时发送该消息,无参数。

COM_PROCESS_INFO 消息报文

功能:获取当前活动的线程(连接)列表。等同于SQL语句SHOW PROCESSLIST,或是执行mysqladmin processlist命令时发送该消息,无参数。

COM_PROCESS_KILL 消息报文

功能:要求服务器中断某个连接。等同于SQL语句KILL

| 字节 | 说明 |

| — | — |

| 4 | 连接ID号(小字节序) |

COM_DEBUG 消息报文

功能:要求服务器将调试信息保存下来,保存的信息多少依赖于编译选项设置(debug=no|yes|full)。执行mysqladmin debug命令时发送该消息,无参数。

COM_PING 消息报文

功能:该消息用来测试连通性,同时会将服务器的无效连接(超时)计数器清零。执行mysqladmin ping命令时发送该消息,无参数。

COM_CHANGE_USER 消息报文

功能:在不断连接的情况下重新登陆,该操作会销毁MySQL服务器端的会话上下文(包括临时表、会话变量等)。有些连接池用这种方法实现清除会话上下文。

| 字节 | 说明 |

| — | — |

| n | 用户名(字符串以NULL结尾) |

| n | 密码(挑战数) |

| | MySQL 3.23 版本:Null-Terminated String(长度9字节) |

| | MySQL 4.1 版本:Length Coded String(长度1+21字节) |

| n | 数据库名称(Null-Terminated String) |

| 2 | 字符编码 |

COM_BINLOG_DUMP 消息报文

功能:该消息是备份连接时由从服务器向主服务器发送的最后一个请求,主服务器收到后,会响应一系列的报文,每个报文都包含一个二进制日志事件。如果主服务器出现故障时,会发送一个EOF报文。

| 字节 | 说明 |

| — | — |

| 4 | 二进制日志数据的起始位置(小字节序) |

| 4 | 二进制日志数据标志位(目前未使用,永远为0x00) |

| 4 | 从服务器的服务器ID值(小字节序) |

| n | 二进制日志的文件名称(可选,默认值为主服务器上第一个有效的文件名) |

COM_TABLE_DUMP 消息报文

功能:将数据表从主服务器复制到从服务器中,执行SQL语句LOAD TABLE ... FROM MASTER时发送该消息。目前该消息已过时,不再使用。

| 字节 | 说明 |

| — | — |

| n | 数据库名称(Length Coded String) |

| n | 数据表名称(Length Coded String) |

COM_REGISTER_SLAVE 消息报文

功能:在从服务器report_host变量设置的情况下,当备份连接时向主服务器发送的注册消息。

| 字节 | 说明 |

| — | — |

| 4 | 从服务器ID值(小字节序) |

| n | 主服务器IP地址(Length Coded String) |

| n | 主服务器用户名(Length Coded String) |

| n | 主服务器密码(Length Coded String) |

| 2 | 主服务器端口号 |

| 4 | 安全备份级别(由MySQL服务器rpl_recovery_rank变量设置,暂时未使用) |

| 4 | 主服务器ID值(值恒为0x00) |

COM_PREPARE 消息报文

功能:预处理SQL语句,使用带有"?"占位符的SQL语句时发送该消息。

| 字节 | 说明 |

| — | — |

| n | 带有"?"占位符的SQL语句(字符串到达消息尾部时结束,无结束符) |

COM_EXECUTE 消息报文

功能:执行预处理语句。

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值 |

| 1 | 标志位 |

| | 0x00: CURSOR_TYPE_NO_CURSOR |

| | 0x01: CURSOR_TYPE_READ_ONLY |

| | 0x02: CURSOR_TYPE_FOR_UPDATE |

| | 0x04: CURSOR_TYPE_SCROLLABLE |

| 4 | 保留(值恒为0x01) |

| 如果参数数量大于0 | |

| n | 空位图(Null-Bitmap,长度 = (参数数量 + 7) / 8 字节) |

| 1 | 参数分隔标志 |

| 如果参数分隔标志值为1 | |

| n | 每个参数的类型值(长度 = 参数数量 * 2 字节) |

| n | 每个参数的值 |

COM_LONG_DATA 消息报文

该消息报文有两种形式,一种用于发送二进制数据,另一种用于发送文本数据。

功能:用于发送二进制(BLOB)类型的数据(调用mysql_stmt_send_long_data函数)。

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值(小字节序) |

| 2 | 参数序号(小字节序) |

| n | 数据负载(数据到达消息尾部时结束,无结束符) |

功能:用于发送超长字符串类型的数据(调用mysql_send_long_data函数)

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值(小字节序) |

| 2 | 参数序号(小字节序) |

| 2 | 数据类型(未使用) |

| n | 数据负载(数据到达消息尾部时结束,无结束符) |

COM_CLOSE_STMT 消息报文

功能:销毁预处理语句。

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值(小字节序) |

COM_RESET_STMT 消息报文

功能:将预处理语句的参数缓存清空。多数情况和COM_LONG_DATA一起使用。

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值(小字节序) |

COM_SET_OPTION 消息报文

功能:设置语句选项,选项值为/include/mysql_com.h头文件中定义的enum_mysql_set_option枚举类型:

  • MYSQL_OPTION_MULTI_STATEMENTS_ON

  • MYSQL_OPTION_MULTI_STATEMENTS_OFF

| 字节 | 说明 |

| — | — |

| 2 | 选项值(小字节序) |

COM_FETCH_STMT 消息报文

功能:获取预处理语句的执行结果(一次可以获取多行数据)。

| 字节 | 说明 |

| — | — |

| 4 | 预处理语句的ID值(小字节序) |

| 4 | 数据的行数(小字节序) |

服务器响应报文(服务器 -> 客户端)

当客户端发起认证请求或命令请求后,服务器会返回相应的执行结果给客户端。客户端在收到响应报文后,需要首先检查第1个字节的值,来区分响应报文的类型。

| 响应报文类型 | 第1个字节取值范围 |

| — | — |

| OK 响应报文 | 0x00 |

| Error 响应报文 | 0xFF |

| Result Set 报文 | 0x01 - 0xFA |

| Field 报文 | 0x01 - 0xFA |

| Row Data 报文 | 0x01 - 0xFA |

| EOF 报文 | 0xFE |

注:响应报文的第1个字节在不同类型中含义不同,比如在OK报文中,该字节并没有实际意义,值恒为0x00;而在Result Set报文中,该字节又是长度编码的二进制数据结构(Length Coded Binary)中的第1字节。

响应报文

客户端的命令执行正确时,服务器会返回OK响应报文。

MySQL 4.0 及之前的版本

| 字节 | 说明 |

| — | — |

| 1 | OK报文,值恒为0x00 |

| 1-9 | 受影响行数(Length Coded Binary) |

| 1-9 | 索引ID值(Length Coded Binary) |

| 2 | 服务器状态 |

| n | 服务器消息(字符串到达消息尾部时结束,无结束符) |

MySQL 4.1 及之后的版本

| 字节 | 说明 |

| — | — |

| 1 | OK报文,值恒为0x00 |

| 1-9 | 受影响行数(Length Coded Binary) |

| 1-9 | 索引ID值(Length Coded Binary) |

| 2 | 服务器状态 |

| 2 | 告警计数 |

| n | 服务器消息(字符串到达消息尾部时结束,无结束符,可选) |

受影响行数:当执行INSERT/UPDATE/DELETE语句时所影响的数据行数。

索引ID值:该值为AUTO_INCREMENT索引字段生成,如果没有索引字段,则为0x00。注意:当INSERT插入语句为多行数据时,该索引ID值为第一个插入的数据行索引值,而非最后一个。

服务器状态:客户端可以通过该值检查命令是否在事务处理中。

告警计数:告警发生的次数。

服务器消息:服务器返回给客户端的消息,一般为简单的描述性字符串,可选字段。

响应报文

MySQL 4.0 及之前的版本

| 字节 | 说明 |

| — | — |

| 1 | Error报文,值恒为0xFF |

| 2 | 错误编号(小字节序) |

| n | 服务器消息 |

MySQL 4.1 及之后的版本

| 字节 | 说明 |

| — | — |

| 1 | Error报文,值恒为0xFF |

| 2 | 错误编号(小字节序) |

| 1 | 服务器状态标志,恒为’#'字符 |

| 5 | 服务器状态(5个字符) |

| n | 服务器消息 |

错误编号:错误编号值定义在源代码/include/mysqld_error.h头文件中。

服务器状态:服务器将错误编号通过mysql_errno_to_sqlstate函数转换为状态值,状态值由5字节的ASCII字符组成,定义在源代码/include/sql_state.h头文件中。

服务器消息:错误消息字符串到达消息尾时结束,长度可以由消息头中的长度值计算得出。消息长度为0-512字节。

Result Set 消息

当客户端发送查询请求后,在没有错误的情况下,服务器会返回结果集(Result Set)给客户端。

Result Set 消息分为五部分,结构如下:

| 结构 | 说明 |

| — | — |

| [Result Set Header] | 列数量 |

| [Field] | 列信息(多个) |

| [EOF] | 列结束 |

| [Row Data] | 行数据(多个) |

| [EOF] | 数据结束 |

Result Set Header 结构

| 字节 | 说明 |

| — | — |

| 1-9 | Field结构计数(Length Coded Binary) |

| 1-9 | 额外信息(Length Coded Binary) |

Field结构计数:用于标识Field结构的数量,取值范围0x00-0xFA。

额外信息:可选字段,一般情况下不应该出现。只有像SHOW COLUMNS这种语句的执行结果才会用到额外信息(标识表格的列数量)。

Field 结构

Field为数据表的列信息,在Result Set中,Field会连续出现多次,次数由Result Set Header结构中的IField结构计数值决定。

MySQL 4.0 及之前的版本

| 字节 | 说明 |

| — | — |

| n | 数据表名称(Length Coded String) |

| n | 列(字段)名称(Length Coded String) |

| 4 | 列(字段)长度(Length Coded String) |

| 2 | 列(字段)类型(Length Coded String) |

| 2 | 列(字段)标志(Length Coded String) |

| 1 | 整型值精度 |

| n | 默认值(Length Coded String) |

MySQL 4.1 及之后的版本

| 字节 | 说明 |

| — | — |

| n | 目录名称(Length Coded String) |

| n | 数据库名称(Length Coded String) |

| n | 数据表名称(Length Coded String) |

| n | 数据表原始名称(Length Coded String) |

| n | 列(字段)名称(Length Coded String) |

| 4 | 列(字段)原始名称(Length Coded String) |

| 1 | 填充值 |

| 2 | 字符编码 |

| 4 | 列(字段)长度 |

| 1 | 列(字段)类型 |

| 2 | 列(字段)标志 |

| 1 | 整型值精度 |

| 2 | 填充值(0x00) |

| n | 默认值(Length Coded String) |

目录名称:在4.1及之后的版本中,该字段值为"def"。

数据库名称:数据库名称标识。

数据表名称:数据表的别名(AS之后的名称)。

数据表原始名称:数据表的原始名称(AS之前的名称)。

列(字段)名称:列(字段)的别名(AS之后的名称)。

列(字段)原始名称:列(字段)的原始名称(AS之前的名称)。

字符编码:列(字段)的字符编码值。

列(字段)长度:列(字段)的长度值,真实长度可能小于该值,例如VARCHAR(2)类型的字段实际只能存储1个字符。

列(字段)类型:列(字段)的类型值,取值范围如下(参考源代码/include/mysql_com.h头文件中的enum_field_type枚举类型定义):

| 类型值 | 名称 |

| — | — |

| 0x00 | FIELD_TYPE_DECIMAL |

| 0x01 | FIELD_TYPE_TINY |

| 0x02 | FIELD_TYPE_SHORT |

| 0x03 | FIELD_TYPE_LONG |

| 0x04 | FIELD_TYPE_FLOAT |

| 0x05 | FIELD_TYPE_DOUBLE |

| 0x06 | FIELD_TYPE_NULL |

| 0x07 | FIELD_TYPE_TIMESTAMP |

| 0x08 | FIELD_TYPE_LONGLONG |

| 0x09 | FIELD_TYPE_INT24 |

| 0x0A | FIELD_TYPE_DATE |

| 0x0B | FIELD_TYPE_TIME |

| 0x0C | FIELD_TYPE_DATETIME |

| 0x0D | FIELD_TYPE_YEAR |

| 0x0E | FIELD_TYPE_NEWDATE |

| 0x0F | FIELD_TYPE_VARCHAR (new in MySQL 5.0) |

| 0x10 | FIELD_TYPE_BIT (new in MySQL 5.0) |

| 0xF6 | FIELD_TYPE_NEWDECIMAL (new in MYSQL 5.0) |

| 0xF7 | FIELD_TYPE_ENUM |

| 0xF8 | FIELD_TYPE_SET |

| 0xF9 | FIELD_TYPE_TINY_BLOB |

| 0xFA | FIELD_TYPE_MEDIUM_BLOB |

| 0xFB | FIELD_TYPE_LONG_BLOB |

| 0xFC | FIELD_TYPE_BLOB |

| 0xFD | FIELD_TYPE_VAR_STRING |

| 0xFE | FIELD_TYPE_STRING |

| 0xFF | FIELD_TYPE_GEOMETRY |

列(字段)标志:各标志位定义如下(参考源代码/include/mysql_com.h头文件中的宏定义):

| 标志位 | 名称 |

| — | — |

| 0x0001 | NOT_NULL_FLAG |

| 0x0002 | PRI_KEY_FLAG |

| 0x0004 | UNIQUE_KEY_FLAG |

| 0x0008 | MULTIPLE_KEY_FLAG |

| 0x0010 | BLOB_FLAG |

| 0x0020 | UNSIGNED_FLAG |

| 0x0040 | ZEROFILL_FLAG |

| 0x0080 | BINARY_FLAG |

| 0x0100 | ENUM_FLAG |

| 0x0200 | AUTO_INCREMENT_FLAG |

| 0x0400 | TIMESTAMP_FLAG |

| 0x0800 | SET_FLAG |

数值精度:该字段对DECIMALNUMERIC类型的数值字段有效,用于标识数值的精度(小数点位置)。

默认值:该字段用在数据表定义中,普通的查询结果中不会出现。

:Field结构的相关处理函数:

  • 客户端:/client/client.c源文件中的unpack_fields函数

  • 服务器:/sql/sql_base.cc源文件中的send_fields函数

EOF 结构

EOF结构用于标识Field和Row Data的结束,在预处理语句中,EOF也被用来标识参数的结束。

MySQL 4.0 及之前的版本

| 字节 | 说明 |

| — | — |

| 1 | EOF值(0xFE) |

MySQL 4.1 及之后的版本

| 字节 | 说明 |

| — | — |

| 1 | EOF值(0xFE) |

| 2 | 告警计数 |

| 2 | 状态标志位 |

告警计数:服务器告警数量,在所有数据都发送给客户端后该值才有效。

状态标志位:包含类似SERVER_MORE_RESULTS_EXISTS这样的标志位。

:由于EOF值与其它Result Set结构共用1字节,所以在收到报文后需要对EOF包的真实性进行校验,校验条件为:

  • 第1字节值为0xFE

  • 包长度小于9字节

:EOF结构的相关处理函数:

  • 服务器:protocol.cc源文件中的send_eof函数

Row Data 结构

在Result Set消息中,会包含多个Row Data结构,每个Row Data结构又包含多个字段值,这些字段值组成一行数据。

| 字节 | 说明 |

| — | — |

| n | 字段值(Length Coded String) |

| … | (一行数据中包含多个字段值) |

字段值:行数据中的字段值,字符串形式。

:Row Data结构的相关处理函数:

  • 客户端:/client/client.c源文件中的read_rows函数

Row Data 结构(二进制数据)

该结构用于传输二进制的字段值,既可以是服务器返回的结果,也可以是由客户端发送的(当执行预处理语句时,客户端使用Result Set消息来发送参数及数据)。

| 字节 | 说明 |

| — | — |

| 1 | 结构头(0x00) |

| (列数量 + 7 + 2) / 8 | 空位图 |

| n | 字段值 |

| … | (一行数据中包含多个字段值) |

空位图:前2个比特位被保留,值分别为0和1,以保证不会和OK、Error包的首字节冲突。在MySQL 5.0及之后的版本中,这2个比特位的值都为0。

字段值:行数据中的字段值,二进制形式。

PREPARE_OK 响应报文(Prepared Statement)

用于响应客户端发起的预处理语句报文,组成结构如下:

| 结构 | 说明 |

| — | — |

| [PREPARE_OK] | PREPARE_OK结构 |

| 如果参数数量大于0 | |

| [Field] | 与Result Set消息结构相同 |

| [EOF] | |

| 如果列数大于0 | |

| [Field] | 与Result Set消息结构相同 |

| [EOF] | |

其中 PREPARD_OK 的结构如下:

| 字节 | 说明 |

| — | — |

| 1 | OK报文,值为0x00 |

| 4 | 预处理语句ID值 |

| 2 | 列数量 |

| 2 | 参数数量 |

| 1 | 填充值(0x00) |

| 2 | 告警计数 |

Parameter 响应报文(Prepared Statement)

预处理语句的值与参数正确对应后,服务器会返回 Parameter 报文。

| 字节 | 说明 |

| — | — |

| 2 | 类型 |

| 2 | 标志 |

| 1 | 数值精度 |

| 4 | 字段长度 |

类型:与 Field 结构中的字段类型相同。

标志:与 Field 结构中的字段标志相同。

数值精度:与 Field 结构中的数值精度相同。

字段长度:与 Field 结构中的字段长度相同。

代码分析


议程

协议头

协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API

协议头

● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头.

. packet length(3字节), 包体的长度

. packet number(1字节), 从0开始的递增的

● sql “select 1” 的网络协议是?

协议头

● packet length三个字节意味着MySQL packet最大16M大于16M则被分包(net_write_command, my_net_write)

● packet number分包从0开始,依次递增.每一次执行sql, packet_number清零(sql/net_serv.c:net_clear)

协议类型

● handshake

● auth

● ok|error

● resultset

​ ○ header

​ ○ field

​ ○ eof

​ ○ row

● command packet

连接时的交互

协议说明

● 协议内字段分三种形式

​ ○ 固定长度(include/my_global.h)

​ ■ uint*korr 解包 *

​ ■ int*store 封包

​ ○ length coded binary(sql-common/pack.c)

​ ■ net_field_length 解包

​ ■ net_store_length 封包

​ ○ null-terminated string

● length coded binary

​ ○ 避免binary unsafe string, 字符串的长度保存在字符串的前面

​ ■ length<251 1 byte

​ ■ length <256^2 3 byte(第一个byte是252)

​ ■ length<256^3 4byte(第一个byte是253)

​ ■ else 9byte(第一个byte是254)

handshake packet

● 该协议由服务端发送客户端

● 括号内为字节数,字节数为n为是null-terminated string;字节数为大写的N表示length code binary.

● salt就是scramble.分成两个部分是为了兼容4.1版本

● sql_connect.cc:check_connection

● sql_client.c:mysql_real_connect

auth packet

● 该协议是从客户端对密码使用scramble加密后发送到服务端

● 其中databasename是可选的.salt就是加密后的密码.

● sql_client.c:mysql_real_connect

● sql_connect.c:check_connection

ok packet

● ok包,命令和insert,update,delete的返回结果

● 包体首字节为0.

● insert_id, affect_rows也是一并发过来.

● src/protocol.cc:net_send_ok

error packet

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

​ ■ length <256^2 3 byte(第一个byte是252)

​ ■ length<256^3 4byte(第一个byte是253)

​ ■ else 9byte(第一个byte是254)

handshake packet

● 该协议由服务端发送客户端

● 括号内为字节数,字节数为n为是null-terminated string;字节数为大写的N表示length code binary.

● salt就是scramble.分成两个部分是为了兼容4.1版本

● sql_connect.cc:check_connection

● sql_client.c:mysql_real_connect

auth packet

● 该协议是从客户端对密码使用scramble加密后发送到服务端

● 其中databasename是可选的.salt就是加密后的密码.

● sql_client.c:mysql_real_connect

● sql_connect.c:check_connection

ok packet

● ok包,命令和insert,update,delete的返回结果

● 包体首字节为0.

● insert_id, affect_rows也是一并发过来.

● src/protocol.cc:net_send_ok

error packet

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
[外链图片转存中…(img-2TeKqwEZ-1712579930617)]
[外链图片转存中…(img-c5X1z7eO-1712579930617)]
[外链图片转存中…(img-nxIlZGfA-1712579930617)]

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-KGWzz3Vy-1712579930618)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值