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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM