ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Netty客户端使用以及重连

2022-08-29 16:02:24  阅读:237  来源: 互联网

标签:Netty Exception ip ctx public 重连 port 服务端 客户端


Netty客户端使用以及重连

1. pom依赖

<dependency>
    <groupId>io.netty</groupId>
	<artifactId>netty-all</artifactId>
	<version>4.1.30.Final</version>
</dependency>

2. 测试工具

链接:https://pan.baidu.com/s/1g64RpTcPwIgVFybcOFEJVA
提取码:ncz9

3. 代码实现

public class NettyClientUtil {

    static String[] ips = {"127.0.0.1"};
    static Integer port = 8886;
    static Bootstrap bootstrap;
    // 客户端就只需要创建一个 线程组了
    static EventLoopGroup loopGroup = new NioEventLoopGroup();

    public static void main(String[] args) {
        for (String ip : ips) {
            start(ip, port);
        }
    }

    public static void start(String ip, Integer port) {

        // 创建 启动器
        bootstrap = new Bootstrap();

        try {
            bootstrap.group(loopGroup)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new IdleStateHandler(30, 0, 0, TimeUnit.SECONDS))
//                                    .addLast(new FixedLengthFrameDecoder(22)) //数据包的长度
                                    .addLast(new NettyClientHandler());
                        }
                    });
            // 连接服务
            ChannelFuture future = connect(ip, port);
            // 对服务关闭 监听
//            future.channel().closeFuture().sync();
        } catch (Exception e) {
            loopGroup.shutdownGracefully();
            System.out.println(e.getMessage());
        } /*finally {

        }*/

    }

    public static ChannelFuture connect(String ip, Integer port) {
        bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
        ChannelFuture channelFuture = bootstrap.connect(ip, port).addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                if (!future.isSuccess()) {
                    System.out.println(Thread.currentThread().getName() + ">>>>>连接" + ip + ":" + port + "服务端超时,1秒后重试……");
                    Thread.sleep(1000);
                    connect(ip, port);
                }
            }
        });
        return channelFuture;
    }
}
public class NettyClientHandler extends ChannelInboundHandlerAdapter {


    /**
     * 连接上服务的回调方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        // 发送数据
        System.out.println(Thread.currentThread().getName() + ">>>>>连接上了" +
                inetSocketAddress.getAddress().getHostAddress() + ":" + inetSocketAddress.getPort() + "服务端....");


    }

    /**
     * 读取服务端返回的信息
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf buf = (ByteBuf) msg;
        System.out.println(Thread.currentThread().getName() + ">>>>>" + buf.toString(CharsetUtil.UTF_8));

    }

    /**
     * 异常断开回调方法
     * 
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        String ip = inetSocketAddress.getAddress().getHostAddress();
        int port = inetSocketAddress.getPort();
        System.out.println(Thread.currentThread().getName() + ">>>>>与服务端" +
                ip + ":" + port + "断开连接,3秒后尝试重试连接……");
        Thread.sleep(3000);
        NettyClientUtil.connect(ip, port);
        super.channelInactive(ctx);
    }


}

4. 结果展示

连接服务端

服务端推送消息

关闭服务端

再次打开服务端

标签:Netty,Exception,ip,ctx,public,重连,port,服务端,客户端
来源: https://www.cnblogs.com/zhimi/p/16636220.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有