当前位置 主页 > 服务器问题 > Linux/apache问题 >

    通过入门demo简单了解netty使用方法

    栏目:Linux/apache问题 时间:2019-12-06 22:04

    这篇文章主要介绍了通过入门demo简单了解netty使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    前言

    最近做一个项目:

    大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据;该数据以$符号开头和结尾,最后将处理的数据存入数据库;

    我想到的处理方式:采用netty来接收和处理数据,然后用mybatis将处理后的数据存入数据库;

    我在这之前从来没使用过netty,在网上倒是看到不少关于netty的文章,如今就趁着这个项目写一下我所学到的东西和遇到的问题,又是怎么去解决的;

    接下来的几篇文章都是围绕着这个项目来写的;本篇主要写netty的入门demo;

    正文

    代码部分

    新建一个maven项目

    首先在pom.xml中导入:

     <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
        <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-all</artifactId>
          <version>5.0.0.Alpha1</version>
        </dependency>

    服务端
    1. DiscardServer类,netty的服务端

    public class DiscardServer {
      public void run(int port) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        System.out.println("准备运行端口:" + port);
        try {
          ServerBootstrap b = new ServerBootstrap();
          b = b.group(bossGroup, workerGroup)
              .channel(NioServerSocketChannel.class)
              .option(ChannelOption.SO_BACKLOG, 128)
              .childHandler(new ChildChannelHandler());
          //绑定端口,同步等待成功
          ChannelFuture f = b.bind(port).sync();
          //等待服务监听端口关闭
          f.channel().closeFuture().sync();
        } finally {
          //退出,释放线程资源
          workerGroup.shutdownGracefully();
          bossGroup.shutdownGracefully();
        }
      }
      public static void main(String[] args) throws Exception {
        new DiscardServer().run(8080);
      }
    }

    2. ChildChannelHandler类:

    public class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
    
      protected void initChannel(SocketChannel socketChannel) throws Exception {
        socketChannel.pipeline().addLast(new DiscardServerHandler());
      }
    }

    3. DiscardServerHandler类

    在这里是继承的ChannelHandlerAdapter类,当然还可以继承其他的类,例如SimpleChannelInboundHandler,ChannelInboundHandlerAdapter都可以

    public class DiscardServerHandler extends ChannelHandlerAdapter {
      @Override
      public void channelRead(ChannelHandlerContext ctx, Object msg) {
    
        try {
          ByteBuf in = (ByteBuf) msg;
          System.out.println("传输内容是");
          System.out.println(in.toString(CharsetUtil.UTF_8));
          ByteBuf resp= Unpooled.copiedBuffer("收到信息$".getBytes());
          ctx.writeAndFlush(resp);
        } finally {
          ReferenceCountUtil.release(msg);
        }
      }
      @Override
      public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 出现异常就关闭
        cause.printStackTrace();
        ctx.close();
      }
    }