类图和对象图(对象是类的实例,那么对象图就是类图的一个实例,类图类名下面无下划线,而对象图是有的):
一、依赖关系(使用带实心箭头的虚线表示):假设A类的变化引起了B类的变化,则说名B类依赖于A类。
依赖关系有如下三种情况:
1、A类是B类的一个成员变量;
2、A类是B类方法当中的一个参数;
3、A类向B类发送消息,从而影响B类发生变化;
二、泛化关系(使用带空心箭头的实线表示):A是B和C的父类,B,C具有公共类(父类)A,说明A是B,C的一般化(概括,也称泛化)
在UML当中,对泛化关系有三个要求:
1、子类与父类应该完全一致,父类所具有的属性、操作,子类应该都有;
2、子类中除了与父类一致的信息以外,还包括额外的信息;
3、可以使用父类的实例的地方,也可以使用子类的实例;
三、关联关系(使用实线来表示):两个类的实例之间存在着某种语义上的联系
关联关系是所有关系当中最最通用的关系;
某种联系不存在非常明确的定义
如:学校、教室和老师
关联关系分为两种:
1、聚合关系
表示的是整体和部分的关系,整体与部分可以分开
如:电话机包括一个话筒
电脑包括键盘、显示器,一台电脑可以和多个键盘、多个显示器搭配,确定键盘和显示器是可以和主机分开的,主机可以选择其他的键盘、显示器组成电脑;
使用带空心菱形的实线来表示
2、组合关系
也是整体与部分的关系,但是整体与部分不可以分开
如:公司和部门,部门是部分,公司是整体,公司A的财务部不可能和公司B的财务部对换,就是说,公司A不能和自己的财务部分开;
人与人的心脏
四、实现关系(使用带空心箭头的虚线表示):是用来规定接口和实线接口的类或者构建结构的关系,接口是操作的集合,而这些操作就用于规定类或者构建的一种服务。
/**
* <pre>
* 定义一些QQ用到的常量,常量的命名方式经过调整,统一为
* QQ_[类别]_[名称]
*
* 比如表示长度的常量,为QQ_LENGTH_XXXXX
* 表示最大值的常量,为QQ_MAX_XXXX
* </pre>
*
* @author luma
*/
QQ接口类中,包含的属性有:
1、public static final String EMPTY_STRING = ""; () /** 空字符串 */
// 协议族标识
2、 // QQ包类型定义
/** QQ基本协议族包头 */
public static final byte QQ_HEADER_BASIC_FAMILY = 0x02;
/** QQ P2P协议族 */
public static final byte QQ_HEADER_P2P_FAMILY = 0x00;
/** 03协议族包头 */
public static final byte QQ_HEADER_03_FAMILY = 0x03;
/** 04开头的协议族,未知含义,文件中转包有用到过 */
public static final byte QQ_HEADER_04_FAMILY = 0x04;
/** 05协议族包头 */
public static final byte QQ_HEADER_05_FAMILY = 0x05;
/** QQ基本协议族包尾 */
public static final byte QQ_TAIL_BASIC_FAMILY = 0x03;
/** 05系列协议族包尾 */
public static final byte QQ_TAIL_05_FAMILY = 0x03;
3、
/** 不需要确认的包的发送次数,这个值应该是随便的,由于QQ Logout包发了4次,所以我选4 */
public static final int QQ_SEND_TIME_NOACK_PACKET = 4;
/** QQ登录包中16到51字节的固定内容 */
public static final byte[] QQ_LOGIN_16_51 = new byte[] {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, (byte)0x86, (byte)0xCC, 0x4C, 0x35, 0x2C,
(byte)0xD3, 0x73, 0x6C, 0x14, (byte)0xF6, (byte)0xF6, (byte)0xAF, (byte)0xC3,
(byte)0xFA, 0x33, (byte)0xA4, 0x01
};
/** QQ登录包中53到68字节的固定内容 */
public static final byte[] QQ_LOGIN_53_68 = new byte[] {
(byte)0x8D, (byte)0x8B, (byte)0xFA, (byte)0xEC, (byte)0xD5, 0x52, 0x17, 0x4A,
(byte)0x86, (byte)0xF9, (byte)0xA7, 0x75, (byte)0xE6, 0x32, (byte)0xD1, 0x6D
};
/** QQ登录包中的未知固定内容 */
public static final byte[] QQ_LOGIN_SEGMENTS = new byte[] {
0x0B, 0x04, 0x02, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, (byte)0xE9, 0x03,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, (byte)0xF3,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
(byte)0xED, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, (byte)0xEC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, (byte)0xEE, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, (byte)0xEF, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, (byte)0xEB, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
4、
/** 包最大大小 */
public static final int QQ_MAX_PACKET_SIZE = 65535;
/**
* 消息最大长度,QQ是最大700字节
*/
public static final int QQ_MAX_SEND_IM = 700;
/** 密钥长度 */
public static final int QQ_LENGTH_KEY = 16;
/** 登陆信息长度 */
public static final int QQ_LENGTH_LOGIN_DATA = 416;
/** QQ UDP缺省端口 */
public static final int QQ_PORT_UDP = 8000;
/** QQ TCP缺省端口 */
public static final int QQ_PORT_TCP = 80;
/** 使用HTTP代理时连接QQ服务器的端口 */
public static final int QQ_PORT_HTTP = 443;
/** QQ缺省编码方式 */
public static final String QQ_CHARSET_DEFAULT = "GBK";
/** 消息编码,好像可以自己胡乱定义 */
public static final char QQ_CHARSET_GB = 0x8602;
public static final char QQ_CHARSET_EN = 0x0000;
public static final char QQ_CHARSET_BIG5 = 0x8603;
/** 单位: ms */
public static final long QQ_TIMEOUT_SEND = 5000;
/** 最大重发次数 */
public static final int QQ_MAX_RESEND = 5;
/** Keep Alive包发送间隔,单位: ms */
public static final long QQ_INTERVAL_KEEP_ALIVE = 100000;
5、
// 和虚拟摄像头有关系
/** 显示虚拟摄像头 */
public static final int QQ_CAM_SHOW_FAKE = 1;
/** 隐藏虚拟摄像头 */
public static final int QQ_CAM_DONT_SHOW_FAKE = 0;
/** QQ分组的名称最大字节长度,注意一个汉字是两个字节 */
public static final int QQ_MAX_GROUP_NAME = 16;
/** QQ昵称的最长长度 */
public static final int QQ_MAX_NAME_LENGTH = 250;
/** QQ缺省表情个数 */
public static final int QQ_COUNT_DEFAULT_FACE = 96;
/** 得到用户信息的回复包字段个数 */
public static final int QQ_COUNT_GET_USER_INFO_FIELD = 37;
/** 修改用户信息的请求包字段个数,比实际的多1,最开始的QQ号不包括 */
public static final int QQ_COUNT_MODIFY_USER_INFO_FIELD = 35;
/** 用户备注信息的字段个数 */
public static final int QQ_COUNT_REMARK_FIELD = 7;
/** 客户端版本号标志 - QQ2005 */
public static final char QQ_CLIENT_VERSION_0E1B = 0x0E1B;
/**
* 服务器端版本号 (不一定)
* 不一定真的是表示服务器端版本号,似乎和发出的包不同,这个有其他的含义,
* 感觉像是包的类型标志
*/
public static final char QQ_SERVER_VERSION_0100 = 0x0100;
6、
/** 中转服务器版本号 */
public static final char QQ_AGENT_SERVER_VERSION_04D1 = 0x04D1;
/** 程序缺省使用的客户端版本号 */
public static final char QQ_CLIENT_VERSION = QQ_CLIENT_VERSION_0E1B;
/** 正常登陆 */
public static final byte QQ_LOGIN_MODE_NORMAL = 0x0A;
/** 隐身登陆 */
public static final byte QQ_LOGIN_MODE_HIDDEN = 0x28;
/** 性别-男 */
public static final byte QQ_GENDER_GG = 0x0;
/** 性别-女 */
public static final byte QQ_GENDER_MM = 0x1;
/** 性别-未知 */
public static final byte QQ_GENDER_UNKNOWN = (byte)0xFF;
7、
/** 在线状态-在线 */
public static final byte QQ_STATUS_ONLINE = 0x0A;
/** 在线状态-离线 */
public static final byte QQ_STATUS_OFFLINE = 0x14;
/** 在线状态-离开 */
public static final byte QQ_STATUS_AWAY = 0x1E;
/** 在线状态-隐身 */
public static final byte QQ_STATUS_HIDDEN = 0x28;
8、
// 回复常量
/** 通用常量,操作成功 */
public static final byte QQ_REPLY_OK = 0x00;
/** 对方已经是我的好友 */
public static final byte QQ_REPLY_ADD_FRIEND_ALREADY = (byte)0x99;
/** 请求登录令牌成功 */
public static final byte QQ_REPLY_REQUEST_LOGIN_TOKEN_OK = 0x00;
/** 登录信息-重定向 */
public static final byte QQ_REPLY_LOGIN_REDIRECT = 0x01;
/** 登录信息-登录失败 */
public static final byte QQ_REPLY_LOGIN_FAIL = 0x05;
/** 改变在线状态成功 */
public static final byte QQ_REPLY_CHANGE_STATUS_OK = 0x30;
/** 发送认证消息成功 */
public static final byte QQ_REPLY_ADD_FRIEND_AUTH_OK = 0x30;
/** 高级搜索结束,没有更多数据 */
public static final byte QQ_REPLY_ADVANCED_SEARCH_END = 1;
/** 申请中转服务器,重定向 */
public static final char QQ_REPLY_REQUEST_AGENT_REDIRECT = 0x0001;
/** 申请中转服务器成功 */
public static final char QQ_REPLY_REQUEST_AGENT_OK = 0x0000;
/** 要发送的图片太大 */
public static final char QQ_REPLY_REQUEST_AGENT_TOO_LONG = 0x0003;
9、
/** 命令常量 - 登出 */
public static final char QQ_CMD_LOGOUT = 0x0001;
/** 命令常量 - 保持在线状态 */
public static final char QQ_CMD_KEEP_ALIVE = 0x0002;
/** 命令常量 - 修改自己的信息 */
public static final char QQ_CMD_MODIFY_INFO = 0x0004;
/** 命令常量 - 查找用户 */
public static final char QQ_CMD_SEARCH_USER = 0x0005;
/** 命令常量 - 得到好友信息 */
public static final char QQ_CMD_GET_USER_INFO = 0x0006;
/**
* 命令常量 - 添加一个好友
*
* @deprecated 2005使用QQ_CMD_ADD_FRIEND_EX
*/
public static final char QQ_CMD_ADD_FRIEND = 0x0009;
/** 命令常量 - 删除一个好友 */
public static final char QQ_CMD_DELETE_FRIEND = 0x000A;
/** 命令常量 - 发送验证信息 */
public static final char QQ_CMD_ADD_FRIEND_AUTH = 0x000B;
/** 命令常量 - 改变自己的在线状态 */
public static final char QQ_CMD_CHANGE_STATUS = 0x000D;
/** 命令常量 - 确认收到了系统消息 */
public static final char QQ_CMD_ACK_SYS_MSG = 0x0012;
/** 命令常量 - 发送消息 */
public static final char QQ_CMD_SEND_IM = 0x0016;
/** 命令常量 - 接收消息 */
public static final char QQ_CMD_RECV_IM = 0x0017;
/** 命令常量 - 把自己从对方好友名单中删除 */
public static final char QQ_CMD_REMOVE_SELF = 0x001C;
/** 请求一些操作需要的密钥,比如文件中转,视频也有可能 */
public static final char QQ_CMD_REQUEST_KEY = 0x001D;
/** 命令常量 - 登陆 */
public static final char QQ_CMD_LOGIN = 0x0022;
/** 命令常量 - 得到好友列表 */
public static final char QQ_CMD_GET_FRIEND_LIST = 0x0026;
/** 命令常量 - 得到在线好友列表 */
public static final char QQ_CMD_GET_ONLINE_OP = 0x0027;
/** 命令常量 - 发送短消息 */
public static final char QQ_CMD_SEND_SMS = 0x002D;
/** 命令常量 - 群相关命令 */
public static final char QQ_CMD_CLUSTER_CMD = 0x0030;
/** 命令常量 - 测试连接 */
public static final char QQ_CMD_TEST = 0x0031;
/** 命令常量 - 分组数组操作 */
public static final char QQ_CMD_GROUP_DATA_OP = 0x003C;
/** 命令常量 - 上传分组中的好友QQ号列表 */
public static final char QQ_CMD_UPLOAD_GROUP_FRIEND = 0x003D;
/** 命令常量 - 好友相关数据操作 */
public static final char QQ_CMD_FRIEND_DATA_OP = 0x003E;
/** 命令常量 - 下载分组中的好友QQ号列表 */
public static final char QQ_CMD_DOWNLOAD_GROUP_FRIEND = 0x0058;
/** 命令常量 - 好友等级信息相关操作 */
public static final char QQ_CMD_FRIEND_LEVEL_OP = 0x005C;
/** 命令常量 - 隐私数据操作 */
public static final char QQ_CMD_PRIVACY_DATA_OP = 0x005E;
/** 命令常量 - 群数据操作命令 */
public static final char QQ_CMD_CLUSTER_DATA_OP = 0x005F;
/** 命令常量 - 好友高级查找 */
public static final char QQ_CMD_ADVANCED_SEARCH = 0x0061;
/** 命令常量 - 请求登录令牌 */
public static final char QQ_CMD_REQUEST_LOGIN_TOKEN = 0x0062;
/** 命令常量 - 用户属性操作 */
public static final char QQ_CMD_USER_PROPERTY_OP = 0x0065;
/** 命令常量 - 临时会话操作 */
public static final char QQ_CMD_TEMP_SESSION_OP = 0x0066;
/** 命令常量 - 个性签名的操作 */
public static final char QQ_CMD_SIGNATURE_OP = 0x0067;
/** 命令常量 - 接收到系统消息 */
public static final char QQ_CMD_RECV_MSG_SYS = 0x0080;
/** 命令常量 - 好友改变状态 */
public static final char QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS = 0x0081;
/** 命令常量 - 天气操作 */
public static final char QQ_CMD_WEATHER_OP = 0x00A6;
/** 命令常量 - QQ2005使用的添加好友命令 */
public static final char QQ_CMD_ADD_FRIEND_EX = 0x00A7;
/** 命令常量 - 发送验证消息 */
public static final char QQ_CMD_AUTHORIZE = 0X00A8;
/** 命令常量 - 未知命令,调试用途 */
public static final char QQ_CMD_UNKNOWN = 0xFFFF;
10、
/** 命令常量 - 登出 */
public static final char QQ_CMD_LOGOUT = 0x0001;
/** 命令常量 - 保持在线状态 */
public static final char QQ_CMD_KEEP_ALIVE = 0x0002;
/** 命令常量 - 修改自己的信息 */
public static final char QQ_CMD_MODIFY_INFO = 0x0004;
/** 命令常量 - 查找用户 */
public static final char QQ_CMD_SEARCH_USER = 0x0005;
/** 命令常量 - 得到好友信息 */
public static final char QQ_CMD_GET_USER_INFO = 0x0006;
/**
* 命令常量 - 添加一个好友
*
* @deprecated 2005使用QQ_CMD_ADD_FRIEND_EX
*/
public static final char QQ_CMD_ADD_FRIEND = 0x0009;
/** 命令常量 - 删除一个好友 */
public static final char QQ_CMD_DELETE_FRIEND = 0x000A;
/** 命令常量 - 发送验证信息 */
public static final char QQ_CMD_ADD_FRIEND_AUTH = 0x000B;
/** 命令常量 - 改变自己的在线状态 */
public static final char QQ_CMD_CHANGE_STATUS = 0x000D;
/** 命令常量 - 确认收到了系统消息 */
public static final char QQ_CMD_ACK_SYS_MSG = 0x0012;
/** 命令常量 - 发送消息 */
public static final char QQ_CMD_SEND_IM = 0x0016;
/** 命令常量 - 接收消息 */
public static final char QQ_CMD_RECV_IM = 0x0017;
/** 命令常量 - 把自己从对方好友名单中删除 */
public static final char QQ_CMD_REMOVE_SELF = 0x001C;
/** 请求一些操作需要的密钥,比如文件中转,视频也有可能 */
public static final char QQ_CMD_REQUEST_KEY = 0x001D;
/** 命令常量 - 登陆 */
public static final char QQ_CMD_LOGIN = 0x0022;
/** 命令常量 - 得到好友列表 */
public static final char QQ_CMD_GET_FRIEND_LIST = 0x0026;
/** 命令常量 - 得到在线好友列表 */
public static final char QQ_CMD_GET_ONLINE_OP = 0x0027;
/** 命令常量 - 发送短消息 */
public static final char QQ_CMD_SEND_SMS = 0x002D;
/** 命令常量 - 群相关命令 */
public static final char QQ_CMD_CLUSTER_CMD = 0x0030;
/** 命令常量 - 测试连接 */
public static final char QQ_CMD_TEST = 0x0031;
/** 命令常量 - 分组数组操作 */
public static final char QQ_CMD_GROUP_DATA_OP = 0x003C;
/** 命令常量 - 上传分组中的好友QQ号列表 */
public static final char QQ_CMD_UPLOAD_GROUP_FRIEND = 0x003D;
/** 命令常量 - 好友相关数据操作 */
public static final char QQ_CMD_FRIEND_DATA_OP = 0x003E;
/** 命令常量 - 下载分组中的好友QQ号列表 */
public static final char QQ_CMD_DOWNLOAD_GROUP_FRIEND = 0x0058;
/** 命令常量 - 好友等级信息相关操作 */
public static final char QQ_CMD_FRIEND_LEVEL_OP = 0x005C;
/** 命令常量 - 隐私数据操作 */
public static final char QQ_CMD_PRIVACY_DATA_OP = 0x005E;
/** 命令常量 - 群数据操作命令 */
public static final char QQ_CMD_CLUSTER_DATA_OP = 0x005F;
/** 命令常量 - 好友高级查找 */
public static final char QQ_CMD_ADVANCED_SEARCH = 0x0061;
/** 命令常量 - 请求登录令牌 */
public static final char QQ_CMD_REQUEST_LOGIN_TOKEN = 0x0062;
/** 命令常量 - 用户属性操作 */
public static final char QQ_CMD_USER_PROPERTY_OP = 0x0065;
/** 命令常量 - 临时会话操作 */
public static final char QQ_CMD_TEMP_SESSION_OP = 0x0066;
/** 命令常量 - 个性签名的操作 */
public static final char QQ_CMD_SIGNATURE_OP = 0x0067;
/** 命令常量 - 接收到系统消息 */
public static final char QQ_CMD_RECV_MSG_SYS = 0x0080;
/** 命令常量 - 好友改变状态 */
public static final char QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS = 0x0081;
/** 命令常量 - 天气操作 */
public static final char QQ_CMD_WEATHER_OP = 0x00A6;
/** 命令常量 - QQ2005使用的添加好友命令 */
public static final char QQ_CMD_ADD_FRIEND_EX = 0x00A7;
/** 命令常量 - 发送验证消息 */
public static final char QQ_CMD_AUTHORIZE = 0X00A8;
/** 命令常量 - 未知命令,调试用途 */
public static final char QQ_CMD_UNKNOWN = 0xFFFF;
11、
// 消息类型,这个类型比上面的类型又再低一级,他们基本从属于QQ_RECV_IM_FRIEND
// 所以他们是normalIMHeader中的类型
/** 普通文件消息 */
public static final char QQ_IM_TYPE_TEXT = 0x000B;
/** 一个TCP连接请求 */
public static final char QQ_IM_TYPE_TCP_REQUEST = 0x0001;
/** 接收TCP连接请求 */
public static final char QQ_IM_TYPE_ACCEPT_TCP_REQUEST = 0x0003;
/** 拒绝TCP连接请求 */
public static final char QQ_IM_TYPE_REJECT_TCP_REQUEST = 0x0005;
/** UDP连接请求 */
public static final char QQ_IM_TYPE_UDP_REQUEST = 0x0035;
/** 接受UDP连接请求 */
public static final char QQ_IM_TYPE_ACCEPT_UDP_REQUEST = 0x0037;
/** 拒绝UDP连接请求 */
public static final char QQ_IM_TYPE_REJECT_UDP_REQUEST = 0x0039;
/** 通知文件传输端口 */
public static final char QQ_IM_TYPE_NOTIFY_IP = 0x003B;
/** 请求对方主动连接 */
public static final char QQ_IM_TYPE_ARE_YOU_BEHIND_FIREWALL = 0x003F;
/** 未知含意 */
public static final char QQ_IM_TYPE_ARE_YOU_BEHIND_PROXY = 0x0041;
/** 未知含意,0x0041的回复 */
public static final char QQ_IM_TYPE_YES_I_AM_BEHIND_PROXY = 0x0042;
/** 通知文件中转服务器信息 */
public static final char QQ_IM_TYPE_NOTIFY_FILE_AGENT_INFO = 0x004B;
/** 取消TCP或者UDP连接请求 */
public static final char QQ_IM_TYPE_REQUEST_CANCELED = 0x0049;
12、
一、包对象的基类中,包含的属性有:
1、log对象(import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;)
2、解密者 (Crypter)
3、包体缓冲区 (ByteBuffer 类型:ByteBuffer)
4、调试模式开关 (DebugSwitch 类型:Debug切换类,单一实例,控制debug状态的设置和管理Debug客户端,其负责向客户端转发 Debug事件。所以可以有多个调试客户端同时存在。)
5、包命令, 0x03~0x04 (command 类型:char)
6、源标志, 0x01~0x02 (source 类型:char)
7、包序号, 0x05~0x06 (sequence 类型:char)
8、包头字节 (header 类型:byte)
9、QQUser 对象 (封装QQ用户的信息类)
10、duplicated(由于LumaQQ较常发生 消息确认包丢失的问题,所以,这里加一个字段来表示到来的消息包是重复的。类型:boolean)
11、明文包体 bodyDecrypted (类型:byte[])
二、构造函数的构造
1、
/**
* 构造一个指定参数的包
*
* @param header
* 包头
* @param source
* 包源
* @param command
* 包命令
* @param sequence
* 包序号
* @param user
* QQ用户对象
*/
public Packet(byte header, char source, char command, char sequence, QQUser user) {
this.user = user;
this.source = source;
this.command = command;
this.sequence = sequence;
this.duplicated = false;
this.header = header;
}
2、
/**
* 从buf中构造一个OutPacket,用于调试。这个buf里面可能包含了抓包软件抓来的数据
*
* @param buf
* ByteBuffer
* @throws PacketParseException
* 解析出错
*/
protected Packet(ByteBuffer buf, QQUser user) throws PacketParseException {
this(buf, buf.limit() - buf.position(), user);
}
3、
/**
* 从buf中构造一个OutPacket,用于调试。这个buf里面可能包含了抓包软件抓来的数据
*
* @param buf
* ByteBuffer
* @param length
* 要解析的内容长度
* @throws PacketParseException
* 如果解析出错
*/
protected Packet(ByteBuffer buf, int length, QQUser user) throws PacketParseException {
this.user = user;
// 解析头部
parseHeader(buf);
// 检查QQ号
if(!validateHeader())
throw new PacketParseException("包头有误,抛弃该包: " + toString());
// 得到包体
byte[] body = getBodyBytes(buf, length);
bodyDecrypted = decryptBody(body, 0, body.length);
if(bodyDecrypted == null)
throw new PacketParseException("包内容解析出错,抛弃该包: " + toString());
// 包装到ByteBuffer
ByteBuffer tempBuf = ByteBuffer.wrap(bodyDecrypted);
try {
// 解析
parseBody(tempBuf);
} catch (BufferUnderflowException e) {
throw new PacketParseException(e.getMessage());
}
parseTail(buf);
// 查看是否打开了调试模式,如果有,则触发调试事件
if(ds.isDebug()) {
byte[] debugContent = dump();
IDebugObject obj = new PacketDO(getPacketName(), debugContent, this instanceof InPacket, getHeadLength(), debugContent.length - getTailLength());
ds.deliverDebugObject(obj);
}
}
4、
/**
* 构造一个包对象,什么字段也不填,仅限于子类使用
*/
protected Packet() {
}