Netty

概述

Netty是一款用于快速开发高性能网络应用程序的Java开源框架。它不仅是接口和类的集合,还定义了一种架构模型以及一套丰富的设计模式。使用Netty,使得创建可扩展,健壮的网络程序变得更为容易。

Netty的定义

Netty是一款异步的事件驱动的网络应用程序框架,支持快速的开发可维护的高性能的面向协议的服务器和客户端。

Netty的引用

 
   io.netty
    netty-all
    4.1.16.Final
 

Netty的核心组件

Bootstrap启动类

Bootstrap启动类是Netty提供的一个便利的工厂类,可以通过它来完成Netty的客户端或服务器端的Netty组件的组装和Netty程序的初始化。在Netty中,有BootStrap和ServerBootStrap两个启动类,分别应用于客户端和服务端。

EventLoop

Netty中的EventLoop是一个处理事件的机制。当一个事件发生时,他们会将其传递给相应的event handler。

EventLoopGroup

EventLoopGroup指的是一组EventLoops,它们共享一些资源。

Channel

Channel是Java NIO的一个基本构造。它代表一个到实体(如一个硬件设备,一个文件,一个网络套接字或者一个能够执行一个或者多个不同的IO操作的程序组件)的开放连接,如读操作或写操作。常用的Channel是SocketChannel。

ChannelHandler

ChannelHandler用来处理数据,包含两个接口ChannelInboundHandler,ChannelOutboundHandler。Netty引入了编码和解码的概念。解码指的是在ChannelInboundHandler将字节转换为Java对象。而编码指的是将返回的Java对象转换为字节。

ChannelPipeline

ChannelPipeline是Netty中的核心概念。每一个SocketChannel包含一个ChannelPipeline。ChannelPipeline包含一系列ChannelHandler实例。

回调

一个回调其实就是一个方法。

Future

Future提供了另一种在操作完成时通知应用程序的方式。Netty提供了自己的ChannelFuture,用于在执行异步操作的时候使用。

示例代码

创建ChannelHandler

public class HelloServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf inBuffer = (ByteBuf) msg;

        String received = inBuffer.toString(CharsetUtil.UTF_8);
        System.out.println("Server received: " + received);

        ctx.write(Unpooled.copiedBuffer("Hello " + received, CharsetUtil.UTF_8));
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
                .addListener(ChannelFutureListener.CLOSE);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

创建TCPServer

//第一步,创建一个EventLoopGroup
EventLoopGroup group = new NioEventLoopGroup(); 

try{
    //第二步,创建一个ServerBootStrap。
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(group);
    serverBootstrap.channel(NioServerSocketChannel.class);
    serverBootstrap.localAddress(new InetSocketAddress("localhost", 9999));

    serverBootstrap.childHandler(new ChannelInitializer() {
        protected void initChannel(SocketChannel socketChannel) throws Exception {
            socketChannel.pipeline().addLast(new HelloServerHandler());
        }
    });
    ChannelFuture channelFuture = serverBootstrap.bind().sync();
    channelFuture.channel().closeFuture().sync();
} catch(Exception e){
    e.printStackTrace();
} finally {
    group.shutdownGracefully().sync();
}

创建Client

EventLoopGroup group = new NioEventLoopGroup();
try{
    Bootstrap clientBootstrap = new Bootstrap();

    clientBootstrap.group(group);
    clientBootstrap.channel(NioSocketChannel.class);
    clientBootstrap.remoteAddress(new InetSocketAddress("localhost", 9999));
    clientBootstrap.handler(new ChannelInitializer() {
        protected void initChannel(SocketChannel socketChannel) throws Exception {
            socketChannel.pipeline().addLast(new ClientHandler());
        }
    });
    ChannelFuture channelFuture = clientBootstrap.connect().sync();
    channelFuture.channel().closeFuture().sync();
} finally {
    group.shutdownGracefully().sync();
}

你可能感兴趣的:(Netty)