六、netty tcp客户端

所有文章

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

 

posted @ 2020-05-20 11:51  __lay  阅读(1723)  评论(0编辑  收藏  举报