Zookeeper 客户端使用Packet来管理消息,. Packet管理 请求包头(RequestHeader)和请求包体(Record的不同实现,类似于ExistsRequest在调用zookeeper.exists时发送),应答包头(ReplyHeader)和应答包体(Record的不同实现,类似于ExistsResponse). 与服务器进行通信时,依靠自己实现序列化方式来序列化请求包头以及请求包体,并且反序列化应答包头以及应答包体。
请求包序列化格式:
第一部分:4个字节表示整个包的长度(包头+包体)
第二部分:关注RequestHeader 类,Header包头,总共8个字节,前4个字节表示客户端生成的xid,用于跟踪包,采用自增方式生成的,需要服务器在响应时返回,后四个字节表示本包的操作类型:即ZooDefs.OpCode,它是一个整数值,分别代表"notification", "create","delete", "exists","getData", "setData", "getACL","setACL","getChildren", "getChildren2","getMaxChildren", "setMaxChildren", "ping"。getChildren和getChildren2操作的区别在于是否返回Stat统计数据,返回统计数据Stat的操作是getChildren2。
第三部分:关注Record接口的任何实现类,optional,因此长度字节数不固定,可以没有这一部分,例如ping操作