Netty可以用来创建TCP客户端。这里我们将说明如何使用Netty创建一个TCP客户端。使用Netty创建客户端需要一下几个步骤:
每个步骤都会在下面进行讲解,下面是一个完整的使用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();
}
使用Netty创建TCP客户端的第一步是要创建一个EventLoopGroup。因为我们给出的例子中使用了Java NIO,所以创建了一个NioEventLoopGroup。下面是创建EventLoopGroup的代码:
EventLoopGroup group = new NioEventLoopGroup();
使用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端口号。
使用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();
负责连接到远程服务器的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