netty的断线重连问题

摘要:
手头的项目需要用作客户端,使用netty框架从服务器连续接收数据。然而,始终存在一个问题:断开和重新连接。什么是断开连接重新连接?也就是说,我们的客户端应该确保它始终与服务器连接,以便客户端可以向客户端显示实时数据。为了确保连接始终存在,我们必须不断判断连接是否仍然存在,如果不存在,则重新连接。处理程序中有一个channelInactive方法,它可以监听连接的断开事件。我们可以重写这个

手里的这个项目需要作为客户端,不断的接收服务端发来的数据,用的netty框架,但是一直存在一个问题,就是断线重连问题。

什么是断线重连呢?

就是我们这个客户端要保证一直与服务端保持连接,这样客户端才能显示实时的数据给客户,为了保证这个连接一直在,就得不断的去判断这个连接是否还在,如果不在了,就重新连接。

在handler中有个channelInactive方法,可以监听到连接的断开事件。我们可以重写这个方法,比如在这个方法中做重连操作,那么连接断开的时候,就会触发这个方法,来重新连接服务端。

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    super.channelInactive(ctx);
}

但是非正常的断开,比如服务端突然挂了,或者网线突然断了,都无法触发这个方法,那么针对这些可能性,就需要另外处理了。

对此我发现,在这些意外情况发生后,如果给服务端写数据,这时肯定是会操作失败的,在写失败时,这个channelInactive方法被触发了,这样就好办了。

首先我们加一个监听,如果两分钟内没有收到来自服务端的任何数据,我们就向服务端写数据,如果写失败了,那么就会去触发我们的channelInactive方法,就会去重连了。

netty的断线重连问题第1张

netty的断线重连问题第2张

搞定!

免责声明:文章转载自《netty的断线重连问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#开发规范总结(个人建议)Oracle 求昨天 上个月 去年 日期下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

netty中的UDP

UDP 提供了向多个接收者发送消息的额外传输模式: 多播——传输到一个预定义的主机组; 广播——传输到网络(或者子网)上的所有主机。 本示例应用程序将通过发送能够被同一个网络中的所有主机所接收的消息来演示 UDP 广播的使用。为此,我们将使用特殊的受限广播地址或者零网络地址 255.255.255.255。 发送到这个地址的消息都将会被定向给本地网络...

Netty通过心跳保持长链接

 Netty自带心跳检测功能,IdleStateHandler,客户端在写空闲时主动发起心跳请求,服务器接受到心跳请求后给出一个心跳响应。当客户端在一定时间范围内不能够给出响应则断开链接。 Java代码   public class NettyClient {       public void connect(String remoteServer...

netty之SSL协议-netty学习笔记(8)-20210806

1、SSL/TLS简介 协议是Web浏览器与Web服务器之间安全交换信息的协议,提供两个基本的安全服务:鉴别与保密。 1.1、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。 窃听风险(eavesdropping):第三方可以获知通信内容。 篡改风险(tampering):第三方可以修改通信内容。 冒...

Netty Java原生和Netty网络的API比较

  Java原生阻塞IO public class PlainOioServer { public void serve(int port) throws IOException { final ServerSocket socket = new ServerSocket(port); try {...

Netty中的这些知识点,你需要知道!

一、Channel Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口。 Channel是一个门面,封装了包括网络I/O及相关的所有操作。 Channel聚合了包括网络读写、链路管理、网络连接信息、获取EventLoop、Pipeline等相关功能类;统一分配,调度实现相应场景的功能。...

Netty之EventLoop-netty学习笔记(11)-20210813

线程模型概述 基本的线程池化模式可以描述为: 从池的空闲线程列表中选择一个 Thread,并且指派它去运行一个已提交的任务(一个Runnable 的实现);当任务完成时,将该 Thread 返回给该列表,使其可被重用。 虽然池化和重用线程相对于简单地为每个任务都创建和销毁线程是一种进步,但是它并不能 消除由上下文切换所带来的开销,其将随着线程数量的增加很快...