首页 > 其他分享 >Netty客户端使用以及重连

Netty客户端使用以及重连

时间:2022-08-29 16:03:29浏览次数:89  
标签: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,服务端,客户端
From: https://www.cnblogs.com/zhimi/p/16636220.html

相关文章

  • identity4 系列————纯js客户端案例篇[四]
    前言前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢?正文直接贴例子哈。https://github.com/IdentityServer/IdentityServer4/tree/ma......
  • identity4 系列————纯js客户端案例篇[四]
    前言前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢?正文直接贴例子哈。https://github.com/IdentityServer/IdentityServer4/tree/ma......
  • SpringCloud 使用 LoadBalance 实现客户端负载均衡
    SpringCloud从2020.0.1版本开始,从Eureka中移除了Ribbon组件,使用LoadBalance组件来代替Ribbon实现客户端负载均衡。LoadBalance组件相对于Ribbon来说,仅支持两......
  • Netty网络编程-服务端启动
    1、Netty的Handler模型2、服务端代码示例根据模型图可以更好的理解ServerBootstrap引导类设置Netty的属性。publicclassTimeServer{privateintport;pub......
  • 尚硅谷-Netty篇
    学习内容P1P43,P110P116,中间章节好枯燥啊,暂时用不到,先跳过了IO模型参考:https://blog.csdn.net/lzb348110175/article/details/98941378学习链接:https://www.bilibili.co......
  • 客户端连接服务端访问远程配置
    新建一个springcloud-config-client-3355模块:导入config依赖:  配置文件yml: 写ConfigClientController.java 访问profiles中dev环境设置的端口8201 ......
  • Derby 数据库 客户端 ij使用
     Derby数据库是由Apache下的一个开源的DB项目,与其它DB相比,它有如下的优点:  1.完全用Java实现  2.支持JDBC及SQL标准  3.全部文件只有2M左右  4.提供嵌入......
  • MongoDB的安装配置及客户端登陆
    一、CentOS7MongoDB的安装及配置:到官网下载安装包https://www.mongodb.com/try/download/enterprise上传并解压到服务器#mkdir-p/usr/local/mongodb#tar......
  • 如果通过SSMS客户端连接Dataverse
    最近一直有小伙伴问,怎么通过SSMS连接Dataverse,他们在尝试连接的的时候都报了如下的错误  这个问题主要是PP中的TDS终结点没有开启的原因导致1、首先依旧是进入Power......
  • 喜马拉雅PC客户端下载
    喜马拉雅PC客户端简介+下载喜马拉雅PC客户端简介喜马拉雅PC客户端与移动版一样,这里汇聚海量精选内容,不论是相声、小说、评书、新闻、段子、该是英语等内容,应有尽有,界面精......