1. 首页
  2. 软件开发
  3. 搭建简单的Netty开发环境

搭建简单的Netty开发环境

  • 发布于 2024-07-29
  • 17 次阅读

原文链接:https://blog.csdn.net/qq_33227649/article/details/78317912

今天准备学学声明显赫的Netty框架,自然要先学会怎么搭建一个简单的Netty开发环境啦。话不多说,下面进入正文。

编辑器方面自然是推荐IntelJ idea了,idea的强大不必多说,百度一下你就知道。哈哈

下面就是准备Netty的jar包了,如果你会maven的话自然是使用maven最为方便了。只需要在pom文件中导入以下几行

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->

    <dependency>

      <groupId>io.netty</groupId>

      <artifactId>netty-all</artifactId>

      <version>4.1.16.Final</version>

    </dependency>

当然啦,不会maven的也不用愁,可以在官网直接下载jar包,点击跳转。并在编辑器中将下载的jar包引入你的lib中,就可以愉快的开始Netty开发了

下面贴一个简单的netty案例

一、 服务端代码

1. EchoServerHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFutureListener;

import io.netty.channel.ChannelHandler.Sharable;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

import io.netty.util.CharsetUtil;

 

@Sharable

public class EchoServerHandler extends ChannelInboundHandlerAdapter{

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //将客户端传入的消息转换为Netty的ByteBuf类型

        ByteBuf in = (ByteBuf) msg;

 

        // 在控制台打印传入的消息

        System.out.println(

                "Server received: " + in.toString(CharsetUtil.UTF_8)

        );

        //将接收到的消息写给发送者,而不冲刷出站消息

        ctx.write(in);

    }

 

    @Override

    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        // 将未处决消息冲刷到远程节点, 并且关闭该Channel

        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)

                .addListener(ChannelFutureListener.CLOSE);

    }

 

    /**

     * 异常处理

     * @param ctx

     * @param cause

     * @throws Exception

     */

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        //打印异常栈跟踪

        cause.printStackTrace();

 

        // 关闭该Channel

        ctx.close();

    }

}

2. EchoServer.java

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

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 java.net.InetSocketAddress;

 

public class EchoServer {

    private final static int port = 8080;

 

    public static void main(String[] args) {

        start();

    }

 

    private static void start() {

        final EchoServerHandler serverHandler = new EchoServerHandler();

        // 创建EventLoopGroup

        EventLoopGroup bossGroup = new NioEventLoopGroup();

        EventLoopGroup workerGroup = new NioEventLoopGroup();

        // 创建EventLoopGroup

        ServerBootstrap b = new ServerBootstrap();

        b.group(bossGroup, workerGroup)

                //指定所使用的NIO传输Channel

        .channel(NioServerSocketChannel.class)

                //使用指定的端口设置套接字地址

        .localAddress(new InetSocketAddress(port))

                // 添加一个EchoServerHandler到Channle的ChannelPipeline

        .childHandler(new ChannelInitializer<SocketChannel>() {

            @Override

            protected void initChannel(SocketChannel socketChannel) throws Exception {

                //EchoServerHandler被标注为@shareable,所以我们可以总是使用同样的案例

                socketChannel.pipeline().addLast(serverHandler);

            }

        });

 

        try {

            // 异步地绑定服务器;调用sync方法阻塞等待直到绑定完成

            ChannelFuture f = b.bind().sync();

            // 获取Channel的CloseFuture,并且阻塞当前线程直到它完成

            f.channel().closeFuture().sync();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            // 优雅的关闭EventLoopGroup,释放所有的资源

            bossGroup.shutdownGracefully();

            workerGroup.shutdownGracefully();

        }

    }

}

二、 客户端代码

1. EchoClientHandler.java

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandler.Sharable;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.SimpleChannelInboundHandler;

import io.netty.util.CharsetUtil;

 

@Sharable

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        //当被通知Channel是活跃的时候,发送一条消息

        ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));

    }

 

    @Override

    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {

        System.out.println(

                "Client received: " + byteBuf.toString(CharsetUtil.UTF_8)

        );

    }

 

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        cause.printStackTrace();

        ctx.close();

    }

}

2. EchoClient.java

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

 

import java.net.InetSocketAddress;

 

public class EchoClient {

    private final static String HOST = "localhost";

    private final static int PORT = 8080;

 

    public static void start() {

        EventLoopGroup group = new NioEventLoopGroup();

        Bootstrap bootstrap = new Bootstrap();

        bootstrap.group(group)

                .channel(NioSocketChannel.class)

                .remoteAddress(new InetSocketAddress(HOST, PORT))

                .handler(new ChannelInitializer<SocketChannel>() {

                    @Override

                    protected void initChannel(SocketChannel socketChannel) throws Exception {

                        socketChannel.pipeline().addLast(new EchoClientHandler());

                    }

                });

        try {

            ChannelFuture f = bootstrap.connect().sync();

            f.channel().closeFuture().sync();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }finally {

            group.shutdownGracefully();

        }

    }

 

    public static void main(String[] args) {

        start();

    }

}

先后运行EchoServer.java和EchoClient.java.如果控制台分别打印了

Server received: Netty rocks!

和

Client received: Netty rocks!