跳到主要内容

编解码相关

介绍

框架内置了两个编码器来处理请求/响应

  1. TcpExternalCodec,处理 TCP 连接
  2. WebSocketExternalCodec,处理 WebSocket 连接

内置的编码器用于处理 ExternalMessage 统一数据协议的,开发者也可以自定义编码器来处理自定义数据协议。

WebSocket

public class WebSocketExternalCodec extends MessageToMessageCodec<BinaryWebSocketFrame, BarMessage> {
@Override
protected void encode(ChannelHandlerContext ctx, BarMessage message, List<Object> out) {
// ResponseMessage ---> ExternalMessage ---> byte[]
ExternalMessage externalMessage = ExternalCodecKit.convertExternalMessage(message);

byte[] bytes = DataCodecKit.encode(externalMessage);
ByteBuf byteBuf = ctx.alloc().buffer(bytes.length);
byteBuf.writeBytes(bytes);

BinaryWebSocketFrame socketFrame = new BinaryWebSocketFrame(byteBuf);
out.add(socketFrame);
}

@Override
protected void decode(ChannelHandlerContext ctx, BinaryWebSocketFrame binary, List<Object> out) {
// byte[] ---> ExternalMessage ---> RequestMessage
ByteBuf contentBuf = binary.content();
byte[] bytes = new byte[contentBuf.readableBytes()];
contentBuf.readBytes(bytes);

ExternalMessage externalMessage = DataCodecKit.decode(bytes, ExternalMessage.class);
BarMessage message = ExternalCodecKit.convertRequestMessage(externalMessage);
out.add(message);
}
}

TCP

public final class TcpExternalCodec extends MessageToMessageCodec<ByteBuf, BarMessage> {
@Override
protected void encode(ChannelHandlerContext ctx, BarMessage message, List<Object> out) {
// ResponseMessage ---> ExternalMessage ---> byte[]
ExternalMessage externalMessage = ExternalCodecKit.convertExternalMessage(message);
byte[] bytes = DataCodecKit.encode(externalMessage);

ByteBuf buffer = ctx.alloc().buffer(bytes.length + 4);
buffer.writeInt(bytes.length);
buffer.writeBytes(bytes);
out.add(buffer);
}

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) {
// byte[] ---> ExternalMessage ---> RequestMessage
int length = msg.readInt();
byte[] msgBytes = new byte[length];
msg.readBytes(msgBytes);

ExternalMessage externalMessage = DataCodecKit.decode(msgBytes, ExternalMessage.class);
BarMessage message = ExternalCodecKit.convertRequestMessage(externalMessage);
out.add(message);
}
}

自定义编解码

自定义统一数据协议时,只需要将协议转换为 BarMessage 即可。

编写完编解码部分后,还需要将其设置到游戏对外服中。 这里假设你已经熟悉 netty 相关的知识了,所以也就不展开说明这部分的内容了。