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