服务端在一段时间内没有收到客户端的数据,这个现象产生的原因可以分为以下两种。
1.连接假死。
2.非假死状态下确实没有发送数据。
我们只需要排除第二种可能,那么连接自然就是假死的。要排查第二种情况,我们可以在客户端定期发送数据包到服务端,通常这个数据包被称为心跳数据包。我们定义一个Handler,定期发送心跳数据包给服务端。
客户端发送心跳数据给服务端 HeartBeatTimerHandler.java
package com.example.demo.im;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.util.concurrent.TimeUnit;
public class HeartBeatTimerHandler extends ChannelInboundHandlerAdapter {
private static final int HEARTBEAT_INTERVAL = 5;
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
scheduleSendHeartBeat(ctx);
super.channelActive(ctx);
}
private void scheduleSendHeartBeat(ChannelHandlerContext ctx) {
ctx.executor().schedule(() -> {
if (ctx.channel().isActive()) {
ctx.writeAndFlush(new HeartBeatRequ版权声明:本文为zsj777原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。