zoukankan      html  css  js  c++  java
  • netty client 连接超时设置

    public class Client4 {
    
        public static void main(String[] args) {
    
            //worker负责读写数据
            EventLoopGroup worker = new NioEventLoopGroup();
            long st = System.currentTimeMillis();
    
            try {
                //辅助启动类
                Bootstrap bootstrap = new Bootstrap();
    
                //设置线程池
                bootstrap.group(worker);
    
                //设置socket工厂
                bootstrap.channel(NioSocketChannel.class);
    
                /**
                 * *******************************************************************
                 * 如果不设置超时,连接会一直占用本地线程,端口,连接客户端一多,会导致本地端口用尽及CPU压力
                 */
                bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
    
                //设置管道
                bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        //获取管道
                        ChannelPipeline pipeline = socketChannel.pipeline();
                        pipeline.addLast(new LengthFieldBasedFrameDecoder(10000, 0, 4, 0, 4));
                        pipeline.addLast(new ProtobufDecoder(MyBaseProto.BaseProto.getDefaultInstance()));
                        pipeline.addLast(new LengthFieldPrepender(4));
                        pipeline.addLast(new ProtobufEncoder());
    
                        pipeline.addLast(new IdleStateHandler(61, 30, 0, TimeUnit.SECONDS));
                        pipeline.addLast(new ClientHeartbeatHandler());
    
                        //处理类
                        pipeline.addLast(new ClientHandler4Heart());
                    }
                });
    
                //发起异步连接操作(
    // 如果是127.0.0.1,则会直接抛连接异常,由于192。*网络不通,故到时抛超时异常

    ChannelFuture futrue = bootstrap.connect(new InetSocketAddress("192.168.1.1",8866)).sync(); //等待客户端链路关闭 futrue.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); long ed = System.currentTimeMillis(); System.out.println((ed-st)/1000); } finally { //优雅的退出,释放NIO线程组 worker.shutdownGracefully(); } } }
    /**
    * *******************************************************************
    * 如果不设置超时,连接会一直占用本地线程,端口,连接客户端一多,阻塞在那里,会导致本地端口用尽及CPU压力
    */
    bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);


    未设置超时:

    30
    io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.1.1:8866
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:206)
    at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38)
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:123)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    at java.lang.Thread.run(Thread.java:745)

    Process finished with exit code 0

    设置后:

    5
    io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.1.1:8866
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:206)
    at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38)
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:123)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    at java.lang.Thread.run(Thread.java:745)

    Process finished with exit code 0

    192.*这个ip由于网络不通,触发的是超时异常,如果是网络通的,但是服务不通,则会

    java.net.ConnectException: Connection refused: /127.0.0.1:8866
    0
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:191)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:279)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    at java.lang.Thread.run(Thread.java:745)

    Process finished with exit code 0

    立马抛出异常,ConnectException非超时异常

  • 相关阅读:
    看net2.0头晕眼花,是不是该做个具体的程序呢
    安装SQLServer2000时,提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机"
    刚装的WIN7,用了一下午,记一下备忘
    不同系统开启和关闭fso的方法(转)
    希腊字母以及发音
    meta 标签的作用
    电信禁止路由上网的最佳破解方法(转)
    安装系统
    网络工程师笔记
    GHOST操作
  • 原文地址:https://www.cnblogs.com/silyvin/p/9934610.html
Copyright © 2011-2022 走看看