Netty服务类
发布日期:2021-05-07 22:42:12 浏览次数:21 分类:精选文章

本文共 3920 字,大约阅读时间需要 13 分钟。

Netty服务类实现与接送端开发

1. Netty服务类

1.1 服务端监听

Netty服务类负责接收客户端连接并处理数据。在本实现中,服务端采用了线程池的方式来管理客户端连接,提高了服务器的处理能力。

1.2 服务启动

服务启动流程如下:

  • 创建线程池组:分为bossGroupworkGroup,分别负责接收客户端连接和处理数据。
  • 启动Netty服务器:使用ServerBootstrap配置服务器参数,包括绑定的端口号、协议类型等。
  • 配置通道处理:为每个客户端连接创建一个新的线程,添加必要的数据解码和编码器,确保数据正确传输。
  • 1.3 关闭服务

    服务关闭时,会优雅地关闭所有线程池组,释放资源,避免潜在的资源泄漏问题。

    2. 接送端开发

    2.1 接收数据

    接收数据的核心逻辑如下:

  • 从通道读取数据:使用channelRead0方法接收数据流。
  • 解码数据:将字节数据解码为字符串格式。
  • 处理逻辑:检查数据是否包含特定标识符,决定采取相应的处理措施。
  • 2.2 数据处理

    具体数据处理逻辑:

    • 如果数据中包含"CN="标识符,提取相关参数。
    • 调用服务层进行业务处理,返回处理结果。
    • 将处理结果反馈给客户端。

    2.3 数据发送

    数据发送功能主要包括:

    • 获取通道信息:通过MAC地址查询对应的通道。
    • 发送数据:将数据包装后发送至客户端。

    3. 项目启动类

    3.1 主程序启动

    • 使用Spring Boot启动器创建应用程序。
    • 定义主程序类,实现CommandLineRunner接口。
    • run方法中启动Netty服务器。

    3.2 代码结构

    public class DemoApplication implements CommandLineRunner {
    public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
    }
    @Override
    public void run(String... args) {
    new NettyServerListener().start();
    }
    }

    4. 服务类实现

    4.1 服务器监听

    @Component
    @Slf4j
    public class NettyServerListener {
    private static final int port = 8081;
    private NioEventLoopGroup bossGroup;
    private NioEventLoopGroup workGroup;
    public void start() {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workGroup)
    .channel(NioServerSocketChannel.class)
    .childHandler(new ChannelInitializer
    () {
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
    socketChannel.pipeline().addLast(new ServerHandler());
    socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
    socketChannel.pipeline().addLast(new StringEncoder());
    }
    });
    try {
    ChannelFuture future = serverBootstrap.bind(port).sync();
    log.info("Netty通讯服务启动成功:{}", port);
    future.channel().closeFuture().sync();
    } catch (Exception e) {
    log.warn("Netty通讯服务启动失败:{}", port);
    e.printStackTrace();
    } finally {
    try {
    bossGroup.shutdownGracefully().sync();
    workGroup.shutdownGracefully().sync();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    @PreDestroy
    public void close() {
    workGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
    }
    }

    4.2 接送端处理

    @Component
    @Slf4j
    public class ServerHandler extends SimpleChannelInboundHandler {
    private static final Map
    channelMap = new ConcurrentHashMap<>();
    private static ServerHandler serverHandler;
    @Autowired
    private DemoService demoService;
    public ServerHandler() {
    }
    @PostConstruct
    public void init() {
    serverHandler = this;
    serverHandler.demoService = this.demoService;
    }
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
    String request = msg.toString(CharsetUtil.UTF_8);
    log.info("通讯连接:{}", request);
    boolean containsCN = request.contains("CN=20");
    if (containsCN) {
    String cn2 = request.split("CN=")[1].split(";", 0)[0];
    if ("2011".equals(cn2)) {
    int code = demoService.insertData(request);
    ctx.writeAndFlush(Unpooled.copiedBuffer("CN=" + cn2 + ";code=" + code, CharsetUtil.UTF_8));
    }
    }
    }
    public static String sendMsg(String mac, String data) {
    if (StringUtils.isEmpty(channelMap.get(mac))) {
    return "通道不存在!";
    }
    Channel c = channelMap.get(mac);
    c.writeAndFlush(Unpooled.copiedBuffer(data, CharsetUtil.UTF_8));
    return "消息已发送!";
    }
    }

    5. 项目运行

    通过上述实现,开发者可以轻松启动一个高效的Netty服务器,接收客户端数据并进行相应的业务处理。系统支持动态管理通道连接,确保服务的稳定性和可靠性。

    上一篇:idea连接Linux与文件上传
    下一篇:idea之debug调试服务器springboot项目

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月04日 08时25分52秒