0 0

netty长连接服务器断开后,客户端如何重新连接5

private static Bootstrap b = new Bootstrap();


public static void start() throws Exception {


    EventLoopGroup workerGroup = new NioEventLoopGroup();


    try {
// b = new Bootstrap(); // (1)
b.group(workerGroup); // (2)
b.channel(NioSocketChannel.class); // (3)
b.option(ChannelOption.SO_KEEPALIVE, true); // (4)
b.option(ChannelOption.ALLOW_HALF_CLOSURE,true);

        b.handler(new ChannelInitializer<SocketChannel>() {


            @Override
            protected void initChannel(SocketChannel ch) throws Exception {


                ChannelPipeline pipeline = ch.pipeline();


                // 以("\n")为结尾分割的 解码器
                pipeline.addLast("framer", new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()));


                // 字符串解码 和 编码
                pipeline.addLast("decoder", new StringDecoder());
                pipeline.addLast("encoder", new StringEncoder());


                // 自己的逻辑Handler
                pipeline.addLast("handler", new SimpleChannelInboundHandler() {


                    @Override
                    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {


                        logger.debug("接收到的状态内容:" + o.toString());



                    }

                    @Override
                    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {


                        logger.debug("连接成功");
                    }


                    @Override
                    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {



                    }


                    @Override
                    public void channelActive(ChannelHandlerContext ctx) throws Exception {


                        logger.debug("======channelActive========");
                    }


                    @Override
                    public void channelInactive(ChannelHandlerContext ctx) throws Exception {


                        logger.debug("======channelInactive========");
                    }


                    @Override
                    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
                        logger.debug("======exceptionCaught========"+cause.getMessage());                        

                    }
                });

            }
        });
        // Start the client.
        ChannelFuture f = b.connect("127.0.0.1",8060).sync(); // (5)
        // Wait until the connection is closed.
        f.channel().closeFuture().sync();
    }finally{
            workerGroup.shutdownGracefully();
    }
}
2014年5月26日 13:34

4个答案 按时间排序 按投票排序

0 0

ConnectionListener这个代码可否贴出,tkx

2014年10月17日 15:38
0 0

前2天才实现了这个,后来整个设计又把长连接改成短连接..
就是短线重连,服务器重启的时候,等服务器启动好了,能让客户端重连上,对吧。
由于采用的是长连接,因此当connection断掉后,你client端的channelClosed是能感知到的。在这里写一个scheduleExecute,然后不断连接,直到成功。

长连接,就是不允许断,那么只要close你就去连就可以了

2014年5月26日 18:30
0 0

 public class MyInboundHandler extends SimpleChannelInboundHandler {  
   private Client client;  
   public MyInboundHandler(Client client) {  
     this.client = client;  
   }  
   @Override  
   public void channelInactive(ChannelHandlerContext ctx) throws Exception {  
     final EventLoop eventLoop = ctx.channel().eventLoop();  
     eventLoop.schedule(new Runnable() {  
       @Override  
       public void run() {  
         client.createBootstrap(new Bootstrap(), eventLoop);  
       }  
     }, 1L, TimeUnit.SECONDS);  
     super.channelInactive(ctx);  
   }  
 } 
 
  public class Client  
 {  
   private EventLoopGroup loop = new NioEventLoopGroup();  
   public static void main( String[] args )  
   {  
     new Client().run();  
   }  
   public Bootstrap createBootstrap(Bootstrap bootstrap, EventLoopGroup eventLoop) {  
     if (bootstrap != null) {  
       final MyInboundHandler handler = new MyInboundHandler(this);  
       bootstrap.group(eventLoop);  
       bootstrap.channel(NioSocketChannel.class);  
       bootstrap.option(ChannelOption.SO_KEEPALIVE, true);  
       bootstrap.handler(new ChannelInitializer<SocketChannel>() {  
         @Override  
         protected void initChannel(SocketChannel socketChannel) throws Exception {  
           socketChannel.pipeline().addLast(handler);  
         }  
       });  
       bootstrap.remoteAddress("localhost", 8888);
       bootstrap.connect().addListener(new ConnectionListener(this)); 
     }  
     return bootstrap;  
   }  
   public void run() {  
     createBootstrap(new Bootstrap(), loop);
   }  
 }

2014年5月26日 14:43
0 0

这样不可以吗:服务端正常关闭时,会触发客户端的channelInactive事件,在这个事件里面重新连接服务器

2014年5月26日 14:04

相关推荐

    Netty4长连接(服务端+客户端)

    在Netty中,我们可以通过实现ChannelInboundHandler接口并重写channelInactive()方法来监听连接断开事件,然后在该方法中启动一个定时任务,当连接断开时尝试重新连接。这样,即使在网络不稳定或服务器故障的情况下...

    Netty实现Java服务端和C#客户端联通

    在Java服务端,开发者可以利用Netty构建出稳定且高效的网络服务器,处理来自客户端的连接请求。 C#客户端这边,DotNetty是.NET平台上的一个类似Netty的框架,它允许C#开发者创建基于TCP、UDP、HTTP、WebSocket等...

    netty5长连接.自动重连

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在“netty5长连接.自动重连”这个主题中,我们将深入探讨 Netty 如何实现长连接以及自动重连的机制。 首先,...

    Android使用Netty网络框架实践(客户端、服务端)

    在Android环境中,由于安全和权限限制,我们通常需要在后台服务中运行Netty服务器,而在Activity或Service中创建Netty客户端。通过Handler进行主线程和网络线程之间的数据交互,确保UI更新的及时性和线程安全性。 ...

    socket长连接,netty服务器与android源码

    提供的源码可能包含了Android客户端如何建立和维持与Netty服务器的Socket长连接,以及双方如何交换数据的示例。 在分析源码时,应关注以下几个关键点: 1. Android客户端如何创建Socket连接并保持连接。 2. 如何在...

    Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例示例代码.rar

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在本示例中,我们将深入探讨如何利用Netty实现多客户端连接并进行通信,具体以创建一个简单的聊天室群聊功能为例。...

    Netty 实现scoket 主动推送数据到服务和服务端实现方式

    随着物联网的发展,随之出现了各种传感器监测数据的实时发送,需要和netty服务器通讯,netty和传感器之间需要保持长连接(换句话说,netty和gateway之间都会主动给对方发送消息) 碰到的问题: netty作为服务器端如何...

    用Netty实现Websocket(包含服务器代码和客户端网页)

    Websocket是一种在客户端和服务器之间建立长连接的协议,它为双向通信提供了低延迟、高效的数据传输方式。在IT行业中,特别是在实时应用如在线游戏、股票交易、聊天应用等领域,Websocket的应用非常广泛。Netty,一...

    netty客户端服务器通信

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 实现客户端与服务器之间的通信。 首先,我们要理解 Netty 的核心...

    java应用netty服务端和客户端

    综上所述,"java应用netty服务端和客户端"的示例涵盖了Netty框架的基本使用,包括服务器和客户端的启动、连接、数据传输以及模型对象的一致性。理解并掌握这些知识点对于构建基于Java的高性能网络应用至关重要。在...

    netty3 客户端 服务端聊天

    在这个“netty3 客户端 服务端聊天”的示例中,我们将探讨如何使用 Netty 3 实现客户端和服务端之间的长连接通信,以便进行实时的信息收发。 首先,Netty 的核心组件包括 Bootstrap(引导类)、Channel(通道)、...

    Netty简介.pdf(长连接)

    Netty是Java领域的一款高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。它的核心设计理念是简化网络编程的复杂性,提供了一套强大且灵活的API,使得开发者能够专注于业务...

    基于netty实现的mqtt客户端,可用于Java、Android环境.zip

    通过使用Netty,我们可以创建高效的TCP连接,处理大量并发连接,并实现MQTT协议的各种操作,如连接、订阅、发布和断开连接。 3. **构建MQTT客户端** 构建基于Netty的MQTT客户端涉及以下步骤: - 创建Netty的...

    netty 推送 android客户端

    - 在服务器和客户端的通信中,必须正确处理各种异常情况,如连接断开、数据解析错误等,以确保系统的健壮性。 9. **数据解码与编码**: - 在Netty中,服务器和客户端需要有共同的数据编码规则,以便正确解析接收...

    NettySocket同步数据获取实现

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 实现Socket同步数据获取,同时涵盖心跳检测、客户端连接控制以及...

    Netty实现简单的客户端服务端通信示例

    在 Netty 中,服务器称为 BossGroup,客户端连接称为 WorkerGroup,它们分别负责监听新的连接和处理已建立的连接。 **一、服务端实现** 1. 创建 ServerBootstrap:这是启动服务器的基础,可以通过设置参数来配置...

    分布式锁,基于Netty长连接实现,自定义协议,高性能锁

    在分布式锁的实现中,Netty的长连接特性使得客户端与服务端之间的通信更为高效,减少了每次请求建立和断开连接的开销。通过自定义协议设计,可以将锁的获取、释放等操作以特定的格式封装在数据包中,便于在网络中...

    基于netty和protobuf的聊天系统,客户端+服务器

    2. **Netty服务器**:这部分代码实现了服务器端的逻辑,包括监听客户端连接、接收protobuf编码的消息、解析消息内容并进行相应的业务处理,如广播消息给其他在线用户。 3. **Netty客户端**:客户端代码负责与服务器...

    netty游戏服务器核心

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在游戏服务器领域,Netty 的优势在于它的灵活性、可扩展性和高效的性能,使得它成为构建游戏服务器核心层的...

    Netty 教程 Netty权威指南

    4. **心跳机制**:Netty 支持自定义心跳包,确保长连接的有效性,防止因网络延迟导致的连接断开。 5. **WebSocket 和 HTTP/2 支持**:Netty 提供了对 WebSocket 和 HTTP/2 协议的全面支持,方便构建 Web 服务和实时...

Global site tag (gtag.js) - Google Analytics