所有文章
https://www.cnblogs.com/lay2017/p/12922074.html
正文
除了服務端,netty還可以構建客戶端。客戶端你需要
1.創建EventLoopGroup
2.配置Bootstrap
3.創建ChannelInitializer
4.啟動
示例代碼如下
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
第一步是創建EventLoopGroup,相對比較簡單,如
EventLoopGroup group = new NioEventLoopGroup();
創建並配置Bootstrap
和ServerBootstrap類似,客戶端Bootstrap
Bootstrap clientBootstrap = new Bootstrap();
還需要配置一下
clientBootstrap.group(group); clientBootstrap.channel(NioSocketChannel.class); clientBootstrap.remoteAddress(new InetSocketAddress("localhost", 9999));
配置了EventLoopGroup,指定NioSocketChannel,以及server的地址。
創建ChannelInitializer
第三步是創建ChannelInitializer
clientBootstrap.handler(new ChannelInitializer<SocketChannel>() { protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new ClientHandler()); } });
綁定到bootstrap上,並給pipeline添加ClientHandler
啟動
最后一步是啟動
ChannelFuture channelFuture = clientBootstrap.connect().sync();
將會連接到服務端,並同步等待連接完成
如果想等待關閉,這樣寫
channelFuture.channel().closeFuture().sync();
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(); } }