【发布时间】:2014-04-29 23:28:08
【问题描述】:
我正在尝试实现具有多种不同数据包类型的网络协议。我面临的问题是用 Netty 实现这个的最“正确”的方式。我会先发布一些课程,然后描述我想要完成的任务。
public class ItemStack {
public ItemStack(final int item, final int amount) {
if (item < 0) {
throw new IllegalArgumentException("item must be non-negative integer: " + item);
}
if (amount < 1) {
throw new IllegalArgumentException("amount must be positive integer: " + amount);
}
this.item = item;
this.amount = amount;
}
public int getItem() {
return item;
}
public int getAmount() {
return amount;
}
private final int item;
private final int amount;
}
public class ChatMessage {
public ChatMessage(final String playerName, final String message) {
if (playerName == null) {
throw new IllegalArgumentException("playerName must not be null");
}
if (message == null) {
throw new IllegalArgumentException("message must not be null");
}
this.playerName = playerName;
this.message = message;
}
public String getPlayerName() {
return playerName;
}
public String getMessage() {
return message;
}
private final int playerName;
private final int message;
}
现在,所有通过网络传输的 POJO 都将具有一个数据包标识符。这将是一个 1 字节的代码,它将让解码器知道它是什么类型的数据包,以及如何解码它。
处理这种情况最合适的方法是什么?拥有一个扩展 ByteToMessageDecoder 的 PacketDecoder 类会更好(阅读更传统),该类读取一个字节,确定类型,然后在同一个类中,使用适当的方法解码数据包,如下所示:
public class PacketDecoder extends ByteToMessageDecoder {
protected void decode(
final ChannelHandlerContext context, final ByteBuf buf, List<Object> objects) throws Exception {
if (buf.readableBytes < 1) {
return;
}
final int opcode = buf.readByte() & 0xff;
final Packet packet = decodePacket(opcode);
objects.add(packet);
}
private Packet decodePacket(final int opcode, final ByteBuf buf) {
if (buf == null) {
throw new IllegalArgumentException("buf must not be null");
}
Packet packet = null;
switch (opcode) {
case 0:
packet = decodeItemStack(buf);
break;
case 1:
packet = decodeChatMessage(buf);
break;
// ...
}
return packet;
}
}
或者将每种类型的解码器都添加到管道中会更好吗?
【问题讨论】:
标签: java networking netty