当前位置: 首页 > 知识库问答 >
问题:

在Netty IO中服务器停止服务请求后如何重新连接到服务器

赫连鸿振
2023-03-14

线程“main”io.netty.channel.abstractchannel$AnnotatedConnectException:连接被拒绝:无进一步信息:/127.0.0.1:8888在sun.nio.channel.checkConnect(本机方法)在sun.nio.channel.socketchannel.finishConnect(未知源)在io.netty.channel.socket.nio.nicketchannel.dofinishConnect(niosocketchannel.java:325)在原因:java.net.ConnectException:连接被拒绝:没有进一步信息...还有11个

下面的行是我的连接线程的运行部分。

EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group);
bootstrap.channel(NioSocketChannel.class).handler(new 
ChannelInitializer<SocketChannel>() {

        protected void initChannel(SocketChannel socketChannel) throws 
Exception {
            socketChannel.pipeline().addLast(new 
LengthFieldBasedFrameDecoder(64 * 1024, 0, 2));
            socketChannel.pipeline().addLast(ClientHandler);
        }

    });
    bootstrap.option(ChannelOption.SO_REUSEADDR,true);
    ChannelFuture channelFuture=null;
try 
{
    channelFuture = bootstrap.connect(new InetSocketAddress(IP, 
port)).sync();      
    channelFuture.awaitUninterruptibly();
    channelFuture.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture channelFuture)
         {
        try
        {
            if (channelFuture.isSuccess()) {
            if(connectfuture!=null) connectfuture.cancel(true);log.debug("Cancelled connection thread scheduler");

        } else {
            channelFuture.cause().printStackTrace();
        connectfuture=channelFuture.channel().eventLoop().scheduleAtFixedRate(new ClientConnectorThread(ClientHandler,IP,port) , 5,30, TimeUnit.SECONDS);
        }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        }
        } );

}

catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

共有1个答案

李俭
2023-03-14

当我想要实现重新连接逻辑时,我会按照以下方式执行

为捕获空闲状态的管道添加两个处理程序

pipeline.addLast(new ReadTimeoutHandler(readTimeout, TimeUnit.SECONDS));
pipeline.addLast("ReconnectionHandler", new ReconnectionHandler());

reconnectionhandler捕获readtimeouthandler激发的用户事件中,断开通道并尝试重新连接

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
    if (evt instanceof IdleStateEvent) {
        IdleStateEvent e = (IdleStateEvent) evt;
        if (e.state() == IdleState.READER_IDLE) {
            ctx.close();
        }
    } else {
        ctx.fireUserEventTriggered(evt);
    }
}

public void channelUnregistered(final ChannelHandlerContext ctx) throws Exception {
    final EventLoopGroup eventLoopGroup = ctx.channel().eventLoop().parent();
    eventLoopGroup.schedule(() -> {
        bootstrap.connect()
    }, reconnectDelay, TimeUnit.SECONDS);
    ctx.fireChannelUnregistered();
}
 类似资料:
  • 我想连接到一个URL,这是阻止,使用python请求。 我使用了许多不同的代理服务器没有一个为我工作。https://free-proxy-list.net/ 回溯(最近一次调用last):文件“t.py”,第14行,在a=requests.get('https://my-url“,proxies=proxyDict)文件“/home/user/Documents/backend1/venv-li

  • 我使用Sabre DAV在PHP中实现了一个webdav目录,用于我的网站(Application Server Webinterface)。 对于这个网站,我现在使用C#编写了一个TCP套接字,它运行在另一个服务器上(实际上它在同一个数据中心,但从理论上讲,它在另一个半球上)。 我想连接我的网络Dav到我的套接字的FTP服务器,这意味着文件监听,下载,上传。用户只能连接到一个服务。想象一下,我的

  • 问题内容: 我显然正在运行一个实例,因为当我尝试通过输入来启动新服务器时,遇到了以下问题: 我不知道如何停止此服务器并启动新服务器。 在CLI中键入命令时,可以追加任何命令吗? 我的操作系统是Ubuntu 10.04。 问题答案: 连接到节点实例并使用shutdown命令,或者如果您在ubuntu上,则可以尝试通过init.d重新启动Redis服务器: 或停止/启动它: 在Mac上

  • 问题内容: 我在跟踪为什么无法连接到特定主机时遇到问题。 通过curl或浏览器,以下命令可以正常工作: 但是,如果我使用请求: 我得到: 在网络上,我仅看到客户端问好,服务器立即断开连接,因此似乎没有任何ssl或密码不兼容。(我希望这些都是SSL层错误)在这种情况下还有什么其他问题? 我在python 3.6.1上,请求2.14.2(带有安全性额外功能)。 问题答案: 该服务器以多种方式损坏。 一

  • 问题内容: 我一直在使用Tornado Web服务器进行一些测试, 并且到了要停止Web服务器的地步(例如在单元测试期间)。龙卷风网页上存在以下简单示例: 一旦被调用,它将阻塞程序(或当前线程)。读取所述源代码的对象给出了文档在这个例子中功能: 但是,我不知道如何将其集成到我的程序中。其实我有一个封装(有它自己的Web服务器类和函数),但只要我打电话开始,程序(或测试)过程块会反正。 我试图在另一

  • 我正在使用插件Goup-server-li的负载。 如何停止服务器? 我尝试了server.restart(),server.kill(),server.reset() 但总是有这样的错误: 未捕获错误:在Object.exports处侦听EADDRINUSE 127.0.0.1:35729_导出时出现errnoException(util.js:1022:11)_服务器上的exceptionWi