Netty TCP客户端
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();
}
}

