Netty TCP客户端

时间:2020-01-09 10:36:53  来源:igfitidea点击:

Netty也可以用于创建TCP客户端。在本教程中,我将解释如何创建Netty TCP客户端。要使用Netty创建TCP客户端,我们需要:

  • 创建一个EventLoopGroup
  • 创建和配置引导程序
  • 创建一个ChannelInitializer
  • 启动客户端

以下各节将介绍这些步骤中的每个步骤。这首先是完整的Netty TCP客户端示例:

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<SocketChannel>() {
        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();
}

创建一个EventLoopGroup

创建Netty TCP客户端的第一步是创建一个NettyEventLoopGroup。由于此示例使用Java NIO,因此创建了" NioEventLoopGroup"。这行创建EventLoopGroup

EventLoopGroup group = new NioEventLoopGroup();

创建和配置引导程序

用Netty创建TCP客户端的第二步是创建一个NettyBootstrap实例。注意,TCP服务器使用ServerBootstrap,而TCP客户端使用Bootstrap实例。这行创建NettyBootstrap实例:

Bootstrap clientBootstrap = new Bootstrap();

" Bootstrap"实例也必须配置。这些行配置Bootstrap实例:

clientBootstrap.group(group);
clientBootstrap.channel(NioSocketChannel.class);
clientBootstrap.remoteAddress(new InetSocketAddress("localhost", 9999));

这些行在" Bootstrap"实例上设置" EventLoopGroup",指定" Bootstrap"实例使用NIO,并设置要连接的远程IP地址和TCP端口。

创建一个ChannelInitializer

创建Netty TCP客户端的第三步是创建一个ChannelInitializer并将其添加到Bootstrap实例。这是完成的方式:

clientBootstrap.handler(new ChannelInitializer<SocketChannel>() {
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        socketChannel.pipeline().addLast(new ClientHandler());
    }
});

ChannelInitializer将一个ClientHandler实例添加到它创建的SocketChannel上。每当从添加到其的SocketChannel接收到数据时,就会调用ClientHandler。

ClientHandler连接到SocketChannel的通道管道。

启动客户端

创建Netty TCP客户端的最后一步是启动TCP客户端。这是启动TCP客户端的行:

ChannelFuture channelFuture = clientBootstrap.connect().sync();

该行指示" Bootstrap"实例连接到远程服务器,并等待直到连接成功为止。

以下行等待客户端关闭:

channelFuture.channel().closeFuture().sync();

ClientHandler

连接到与远程服务器连接的" SocketChannel"上的" ClientHandler"包含实际的客户端行为。以下是此示例中使用的" ClientHandler"的外观:

public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

    @Override
    public void channelActive(ChannelHandlerContext channelHandlerContext){
        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("Netty Rocks!", CharsetUtil.UTF_8));
    }

    @Override
    public void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf in) {
        System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));
    }

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