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

服务端怎么进行开发,或者说,用Netty怎样实现服务端的功能?

    首先,需要对Netty有一个直观的了解,知道框架内部的几个重要的组件,以及组件之间的相互关系。这就需要初学者主动去学习一下了,官网和图书馆都有相关的资料,只要肯下功夫,这不是什么难题。

    其次,还要求我们对SpringBoot有一定程度的了解,基于注解编程的方式,以及,简单的Java反射的应用。

    下面,我们来着重分析一下,服务端开发中涉及到的内容:

1. 后台线程

    通常情况下,NIO方面的网络编程,都会涉及到三种功能的线程:

    A. 接受外部连接(或者建立与服务端连接)操作的线程;----- IO密集型的操作

    B. 对二进制信息进行编解码转换的线程;                         ----- CPU密集型的操作

    C. 业务逻辑处理方面的线程(可能涉及数据库操作);   ----- 绝大多数情况下是IO密集型的操作,个别也有CPU密集的情况出现

    我们在使用Netty的时候,任何网络状态的变化都会产生对应的事件,(比如 接受新的连接,连接可读,写入完成等等)每一类的事件都会有对应的Handler进行处理,总所周知,Handler里面写的是代码或者说是函数,而执行代码就需要线程调用对应的函数。Netty将线程池封装到了EventLoopGroup(通过类的继承实现的),A类线程构成bossGroup,B类线程构成workerGroup,C类线程需要自己创建线程池。如果程序只监听一个端口,那么bossGroup的线程数设置为1就足够了。workerGroup的数据量与CPU的核心数保持一致就好,如果程序中没有C类线程,那么,C类线程的事情估计就会由B类线程来完成,那么workerGroup的线程数量就会大一些(默认好像是CPU核心数的两倍)。C类线程的数量和配置数据库连接池的连接数量一样,要根据程序和经验来配置,少了的话服务端的性能达不到峰值,多了的话反而会降低服务器的性能。

2. Pipeline

    Netty将通信双方的交互数据的处理过程(记录收发的二进制信息,将二进制信息进行编解码,对收发的数据进行业务处理等等)串成了一条链子,链子的每个节点都会对应的功能。这就是Pipeline组件,它将一系列的ChannelHandler连接起来,共同完成交互数据的处理过程。

    我们的Demo程序涉及到的ChannelHandler如下:

    A. LoggingHandler 记录网络交互过程中传输的二进制信息,开发时可以用来判断收发信息是否正确,以十六进制的形式显示;

    B. GenericPackageCodec 通用编解码处理器,完成二进制与包头、Json串和包尾的相互转换;

    C. GenericPackageClassifierCodec 通用包的分类编解码处理器,完成 Json串 和 Java对象 的相互转换;

    D. NettyServerHander 完成服务端的业务处理。

3. NettyConfigure

    上面我们介绍了主要的设计思路,有了大体的思路之后,我们需要将这些组件的相互关系进行设置,于是,就会构建一个NettyConfigure类,这个类是我自定义的Java类,存放配置信息,然后,用配置信息生成组件对象。

4. NettyServer

    既然是服务端程序,自然要有一个对应的封装类,完成服务端程序的启动和停止。

如果上面所述的思路都理清楚了,就可以进入编码阶段了。后续我会将代码贴出来,大家可以多提一些意见和建议,但是,还是由衷的希望,先去学习一下Netty框架,看看核心组件的源代码,了解了实现原理,再进行讨论。莫要抄袭代码去完成作业,想要进步,还是要多吃苦才好。

 

你可以使用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`中添加相应的处理逻辑。 需要注意的是,这只是一个简单的示例,你可能需要根据具体的业务需求进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值