Netty创建TCP客户端

客户端

Netty可以用来创建TCP客户端。这里我们将说明如何使用Netty创建一个TCP客户端。使用Netty创建客户端需要一下几个步骤:

  • 创建一个EventLoopGroup
  • 创建和配置一个Bootstrap
  • 创建一个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客户端的第一步是要创建一个EventLoopGroup。因为我们给出的例子中使用了Java NIO,所以创建了一个NioEventLoopGroup。下面是创建EventLoopGroup的代码:

EventLoopGroup group = new NioEventLoopGroup();
创建和配置Bootstrap

使用Netty创建TCP客户端的第二部是创建一个Netty的Bootstrap实例。注意,Netty的TCP服务器使用的是ServerBootstrap,但是TCP客户端使用的是一个Bootstrap实例。下面是创建Netty的Bootstrap实例的代码:

Bootstrap clientBootstrap = new Bootstrap();

Bootstrap实例必须进行配置,否则无法使用。下面是配置Bootstrap实例的代码:

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

上面的代码将EventLoopGroup设置到Bootstrap中,指定了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的channel管道中。

启动客户端

使用Netty创建TCP客户端的最后一步是启动客户端。下面是启动客户端的代码:

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

上面的代码命令Bootstrap实例去连接到远程的服务器,并且等待直到它完成。

下面的代码等待直到客户端关闭:

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

负责连接到远程服务器的SocketChannel中附件的ClientHandler包含实际的客户端行为。下面是这个示例中ClientHandler的用法:

public class ClientHandler extends SimpleChannelInboundHandler {

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

原文链接:http://tutorials.jenkov.com/netty/netty-tcp-client.html

你可能感兴趣的:(Netty)