SpringBoot + Netty 实现 Json字符串 的传输(四)

本文探讨如何定义JavaBean以实现Json字符串与二进制信息流的转换。内容包括:定义版本、频道号、命令字的枚举类,创建Package注解绑定数据包类型,建立PackageType与JavaBean的映射,以及展示心跳、聊天消息、登录请求和响应等数据类型的示例。此外,还介绍了PackageFactory用于注册和管理这些映射关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据包的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
你可以使用Spring Boot和Netty实现Json字符串的处理。首先,你需要在Spring Boot项目中集成Netty依赖。可以在你的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.52.Final</version> </dependency> ``` 接下来,你可以创建一个Netty服务器来处理Json字符串。这里是一个简单的示例: ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.LineBasedFrameDecoder; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; public class JsonServer { private int port; public JsonServer(int port) { this.port = port; } public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new StringEncoder()); ch.pipeline().addLast(new JsonHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); System.out.println("Server started on port " + port); b.bind(port).sync().channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; new JsonServer(port).run(); } } ``` 在上面的示例中,我们创建了一个简单的Netty服务器,并使用`StringDecoder`和`StringEncoder`来处理字符串的编码和解码。`JsonHandler`是自定义的处理器,你可以在其中实现Json字符串的处理逻辑。 现在你可以运行这个服务器,并通过发送Json字符串与服务器进行交互。你可以根据自己的需求在`JsonHandler`中添加相应的处理逻辑。 需要注意的是,这只是一个简单的示例,你可能需要根据具体的业务需求进行适当的修改和扩展。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值