首页 > 网站 > 帮助中心 > 正文

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

2024-07-09 22:42:19
字体:
来源:转载
供稿:网友

这篇文章主要介绍了通过入门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();  }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表