git

https://github.com/sea-boat/mysql-protocol

概况

mysql客户端与mysql服务端交互过程中,当服务端完成客户端的某命令时则会返回OK包。

mysql通信报文结构

类型 名字 描述
int<3> payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
int<1> 序列号
string payload 报文体,长度即为前面指定的payload长度

OK包

Payload

Type Name Description
int<1> header [00] or [fe] the OK packet header
int affected_rows affected rows
int last_insert_id last insert-id
if capabilities & CLIENT_PROTOCOL_41 {
int<2> status_flags Status Flags
int<2> warnings number of warnings
}elseif capabilities & CLIENT_TRANSACTIONS {
int<2> status_flags Status Flags
}
if capabilities & CLIENT_SESSION_TRACK {
string info human readable status information
if status_flags & SERVER_SESSION_STATE_CHANGED
string session_state_changes session state info
}
} else {
string info human readable status information
}

更多详情 : http://dev.mysql.com/doc/internals/en/packet-OK_Packet.html

Status Flags

Flag Value
SERVER_STATUS_IN_TRANS 0x0001
SERVER_STATUS_AUTOCOMMIT 0x0002
SERVER_MORE_RESULTS_EXISTS 0x0008
SERVER_STATUS_NO_GOOD_INDEX_USED 0x0010
SERVER_STATUS_NO_INDEX_USED 0x0020
SERVER_STATUS_CURSOR_EXISTS 0x0040
SERVER_STATUS_LAST_ROW_SENT 0x0080
SERVER_STATUS_DB_DROPPED 0x0100
SERVER_STATUS_NO_BACKSLASH_ESCAPES 0x0200
SERVER_STATUS_METADATA_CHANGED 0x0400
SERVER_QUERY_WAS_SLOW 0x0800
SERVER_PS_OUT_PARAMS 0x1000
SERVER_STATUS_IN_TRANS_READONLY 0x2000
SERVER_SESSION_STATE_CHANGED 0x4000

OK包操作

  1. OK包类
/*** * @author seaboat* @date 2016-09-25* @version 1.0* <pre><b>email: </b>849586227@qq.com</pre>* <pre><b>blog: </b>http://blog.csdn.net/wangyangzhizhou</pre>* <p>mysql ok packet.</p>*/
public class OKPacket extends MySQLPacket {public static final byte HEADER = 0x00;public static final byte[] OK = new byte[] { 7, 0, 0, 1, 0, 0, 0, 2, 0, 0,0 };public byte header = HEADER;public long affectedRows;public long insertId;public int serverStatus;public int warningCount;public byte[] message;public void read(byte[] data) {MySQLMessage mm = new MySQLMessage(data);packetLength = mm.readUB3();packetId = mm.read();header = mm.read();affectedRows = mm.readLength();insertId = mm.readLength();serverStatus = mm.readUB2();warningCount = mm.readUB2();if (mm.hasRemaining()) {this.message = mm.readBytesWithLength();}}public void write(ByteBuffer buffer) {BufferUtil.writeUB3(buffer, calcPacketSize());buffer.put(packetId);buffer.put(header);BufferUtil.writeLength(buffer, affectedRows);BufferUtil.writeLength(buffer, insertId);BufferUtil.writeUB2(buffer, serverStatus);BufferUtil.writeUB2(buffer, warningCount);if (message != null) {BufferUtil.writeWithLength(buffer, message);}}@Overridepublic int calcPacketSize() {int i = 1;i += BufferUtil.getLength(affectedRows);i += BufferUtil.getLength(insertId);i += 4;if (message != null) {i += BufferUtil.getLength(message);}return i;}@Overrideprotected String getPacketInfo() {return "MySQL OK Packet";}}
  1. 测试类
/*** * @author seaboat* @date 2016-09-25* @version 1.0* <pre><b>email: </b>849586227@qq.com</pre>* <pre><b>blog: </b>http://blog.csdn.net/wangyangzhizhou</pre>* <p>test ok packet.</p>*/
public class OKPacketTest {@Testpublic void produce() {OKPacket ok = new OKPacket();ok.packetId = 2;ok.affectedRows = 0;ok.insertId = 0;ok.serverStatus = 2;ok.warningCount = 0;ByteBuffer buffer = ByteBuffer.allocate(256);ok.write(buffer);buffer.flip();byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes, 0, bytes.length);String result = HexUtil.Bytes2HexString(bytes);System.out.println(result);assertTrue(Integer.valueOf(result.substring(0, 2), 16) == result.length() / 2 - 4);OKPacket ok2 = new OKPacket();ok2.read(bytes);//auth okassertTrue(result.equals("0700000200000002000000"));}}

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

mysql 协议的OK包及解析相关推荐

  1. mysql eof_详细介绍mysql 协议的EOF包及解析

    git https://github.com/sea-boat/mysql-protocol 概况 mysql的EOF包用于标明查询结果的结尾. mysql通信报文结构类型名字描述int<3&g ...

  2. mysql 协议的ResultsetRow包及解析

    git https://github.com/sea-boat/mysql-protocol 概况 ResultsetRow包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的行记录. ...

  3. mysql 协议的query包及解析

    git https://github.com/sea-boat/mysql-protocol 概况 mysql客户端可以用query包向服务端发送一个基于文本查询. mysql通信报文结构 类型 名字 ...

  4. netty实现mysql协议_基于Netty模拟解析Binlog

    前言 最近一段时间一直再看mysql binlog相关的内容,也整理了几篇相关的文章,对mysql的事件以及通讯协议在理论上有了一个大概的了解,但是缺少实战:本文的目的就是从实战出发,了解binlog ...

  5. MySQL协议解析及C/C++代码实现

    MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...

  6. tshark 解析pcap中带TLS协议的数据包

    tshark的简单用法参考:tshark解析本地pcap数据包提取五元组{src_ip,src_port,proto,dst_ip,dst_port}与时间戳,包长 详细用法:官方DOC 比如提取一个 ...

  7. java实现FTP协议:wireshark抓包解析

    本节我们看看ftp协议的数据包格式,同时使用代码加以实现.首先我们现在机器上安装ftp服务器,我在自己的机器上安装了QuickFTP Server,它是我随便找来的一款Mac ftp服务器,如下图所示 ...

  8. 怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!

    写在前面 最近,在开发一个分库分表中间件,由于功能需求,需要分析MySQL协议,发现网上对于MySQL协议分析的文章大部分都过时了,原因是分析的MySQL版本太低了.怎么办呢?于是乎,我便硬着头皮开始 ...

  9. mysql long类型_怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!...

    点击上方蓝色"冰河技术",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架 ...

最新文章

  1. C语言数字图像处理编程
  2. c语言int t格式,如何在C中打印int64_t类型
  3. const与#define相比,区别和优点超详解总结
  4. CoSENT:比Sentence-BERT更有效的句向量方案
  5. 可以通过执行报表RSVMCRT_MINI_DEBUGGER 查看CRM IPC中定价计算公式的相关源代码
  6. DxO FilmPack 5教程:对照片进行艺术渲染,使其具有专业电影的色彩和颗粒感
  7. 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
  8. 6-6-阶段案例:传智书城JSP页面
  9. layui的table常用方法
  10. b-tree的索引页总览
  11. c语言助手,C语言代码实例助手
  12. 关于第三方支付,看这篇文章就够了!
  13. 单片机Fault故障常见应对办法
  14. 基于药效团模型和分子动力学模拟对PTP-LAR抑制剂的研究
  15. 刷B站学数分Day1|如何写出一份合格的数据分析师简历
  16. 微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
  17. MAC地址和IP地址
  18. 机载LIDAR技术及其应用
  19. 树莓派(ubuntu系统)连接后使用HDMI-VGA,VGA无信号
  20. 比较两给json是否一致

热门文章

  1. [产品07]-产品设计定律-菲茨定律/席克定律
  2. 支付宝服务窗 开发 验证
  3. 国内唯一!腾讯iOA被权威机构报告列入竞争者能力象限
  4. 决策树留一法python代码_机器学习模型2 决策树-基于Python sklearn的实现
  5. Spring框架技术总结(一),java编程自学教程
  6. 安装VS2010的过程遇到VC10.0 Runtime组件安装失败怎么解决
  7. Qt入门教程【QObject篇】属性系统
  8. 什么是反射机制?反射的作用。
  9. 关于上海贝尔实习的感想
  10. 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)