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. linux 环境配置 安装jdk
  2. 边看chromium的代码,边想骂人...
  3. 关于C#调用Excel的资源占用问题
  4. 数据结构:二叉搜索树(BST)的基本操作
  5. 平板电脑安装软件_概述嵌入式工业平板电脑的安装方法和注意事项!
  6. centos8安装并启动tomcat9
  7. 数据访问基础类(基于Access数据库)
  8. 已免押1000亿!芝麻信用:靠信用出去浪
  9. AMQP Connection 127.0.0.1:5672] ERROR [o.s.a.rabbit.connection.CachingConnectionFactory] CachingConn
  10. 一些人一旦离开原来的单位,就不爱再去了,是为什么?
  11. OpenGL坐标的问题?
  12. 【滑动窗口】leetcode209:长度最小的子数组
  13. 初探单点登录 SSO
  14. 一个软件系统的兼容性测试,在兼容性测试中,如何判断软件的兼容性?
  15. 阿里淘咖啡火了 全球九大无人便利店物联网技术方案详解
  16. untiy Socket通信一篇通
  17. RK3288-人脸识别主板方案
  18. Java-设计模式之单例模式
  19. 【算法基础】DFS深度优先算法 —— AcWing 843. n-皇后问题 AcWing 842. 排列数字
  20. matlab 统计数组频数_matlab如何找出一个数在数组中出现次数

热门文章

  1. shuffle洗牌算法java_洗牌算法shuffle
  2. 学习方法推荐——快速阅读
  3. 团体程序设计天梯赛-练习集
  4. flask 开启debug 以及development模式
  5. unity3d培训_003
  6. Zcoin 项目评级:BB ,展望稳定 | TokenInsight
  7. 计算机在一个指令中的过程中,为从内存读取指令操作码,首先要将()的内容送到地址总线上
  8. SyncNet:基于Latency-Aware 的V2V协同感知
  9. 2017秋招第一面--阿里巴巴
  10. 三个故事重新认识roe风和争势