Netty 中的 Channel执行完close之后, 还能进行write吗?

项目中,当账号被顶号时,预期客户端会收到错误消息并断开连接。但偶尔出现客户端无响应的情况。通过日志排查发现顶号逻辑无误,问题出在心跳检测和连接关闭的顺序。如果连接在发送错误消息前被关闭,客户端将无法接收到通知。这个问题涉及到Netty4的连接管理和消息发送流程。
摘要由CSDN通过智能技术生成

问题来源:项目中出现顶号操作的时候,正常情况下被顶掉的连接应该收到一个 “同一账号登录,请退出重登” 的错误消息, 但是偶现客户端接收不到消息的情况(连接实际上已经被服务器干掉了,客户端就呆呆的,点啥也不动)。

解决思路——查日志,在各个怀疑的节点增加日志之后发现顶号 逻辑实际没有问题。只是 我们会通过心跳来 检测当前连接的有效性,也就是 说:

时刻1: 连接A --> login server --> ok
时刻2: 连接B --> login server , 此时全局token 已经变了,①即将给连接A 发 “同一账号登录,请退出重登” 的错误消息。ctx.writeAndFlush(msg)。
            连接A --> send heart pkt , 发现自己连接中的token 和全局token不匹配,②关闭自己的连接–ctx.close()(这里也应该增加一个 发送错误消息的逻辑)。
            如果先②后①就出现客户端收不到消息的现象了。

查看Netty 4代码发现

close 操作执行逻辑
io.netty.channel.AbstractChannel.AbstractUnsafe#close(io.netty.channel.ChannelPromise)
在这里插入图片描述
在这里插入图片描述
writeAndFlush() 操作逻辑
io.netty.channel.AbstractChannelHandlerContext#writeAndFlush(java.lang.Object, io.netty.channel.ChannelPromise)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一路跟进来又来到AbstractChannel这里了
io.netty.channel.AbstractChannel.AbstractUnsafe#write
在这里插入图片描述
flush()
io.netty.channel.AbstractChannel.AbstractUnsafe#flush
在这里插入图片描述

小错误又给我上了一课请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值