数据包的class类应该怎样定义?
通过包结构的分析,以及编解码过程的了解,编解码阶段被拆分成了两个阶段:
一个阶段是 JavaBean 与 Json串 的相互转换;
另一个阶段是 GenericPackage 与 二进制信息流 的相互转换;
本文所介绍的主要内容是上述的 JavaBean 应该怎样定义,才能更方便的进行使用,同时,也能方便的完成另一个阶段的编解码工作。
1. 定义三个枚举类,分别表示数据包的 版本、频道号、命令字。
2. 定义一个名为Package的Annotation,里面可以设置上述的三个枚举变量。
这样的话,我们在设计 JavaBean 的 class 时,只要添加 Package 注解,就可以绑定数据包的类型信息。
3. 定义PackageType类,一个PackageType对象与一个JavaBean的类型相对应。
这个类与上述注解的功能基本相同,只是这个类的对象更容易存储和方便操作。
4. 具体的JavaBean,暂时提供 心跳,聊天消息,登录的请求和应答,这几个数据类型。
5. PackageFactory,能够注册PackageType与JavaBean类型的对应关系,并且支持你想查询和创建JavaBean对象的功能。
package houlei.net.tcp.pkg;
public enum PackageVersion {
Unknown(0),
V10(0x0100);
private short value;
PackageVersion(int version) {
this.value = (short)version;
}
public short getValue() {
return value;
}
public static PackageVersion valueOf(short version) {
for (PackageVersion pv : values()) {
if (pv.value == version) {
return pv;
}
}
return Unknown;
}
}
public enum PackageChannel {
Unknown(0),
Connect(1),
Auth(2),
Chat(3);
private short value;
PackageChannel(int channel) {
this.value = (short)channel;
}
public short getValue() {
return value;
}
public static PackageChannel valueOf(short channel) {
for (PackageChannel pc : values()) {
if (pc.value == channel) {
return pc;
}
}
return Unknown;
}
}
public enum PackageCommand {
Unknown(0),
Hartbeat(0x0101),
LoginReq(0x0201),
LoginRsp(0x0202),
ChatMessage(0x0301);
private short value;
PackageCommand(int command) {
this.value = (short)command;
}
public short getValue() {
return value;
}
public static PackageCommand valueOf(short channel) {
for (PackageCommand pc : values()) {
if (pc.value == channel) {
return pc;
}
}
return Unknown;
}
}
package houlei.net.tcp.pkg;
import java.lang.annotation.*;
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Package {
PackageVersion version() default PackageVersion.V10;
PackageChannel channel();
PackageComma