编解码相关
介绍
框架内置了两个编码器来处理请求/响应
- TcpExternalCodec,处理 TCP 连接
 - 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 相关的知识了,所以也就不展开说明这部分的内容了。