许多客户端(浏览器)可以通过websockets连接到我的服务器(netty-server)。我想要的是,无论何时客户端关闭选项卡(他连接到我的服务器的URL),与他关联的通道也应该取消注册。但这不会自动发生,因为我已经创建了一个hashset并添加了客户端ip到channelRegistered(..)方法中的哈希集,并在channelUnregistered(..)方法中从hashset中删除了ip。但它没有被删除。如果客户端退出浏览器(或者他连接的标签),还有另一种方法可以取消注册频道。谢谢。
答案 0 :(得分:0)
channelRegistered()
和channelUnregistered()
是用于此目的的错误方法。这些方法的目的是在从通道管道添加/删除处理程序本身时进行注册。在调用注册时,由于管道在通道关闭后保持存在,因此不会调用取消注册。
您应该将channelActive()
和channelInactive()
用于您想要的目的。当通道处于活动状态以进行发送时会触发ChannelActive
,而服务器通常会在channelRegistered
之后直接发生,而客户端则在发生套接字连接后发生。在本地套接字上调用channelInactive()
时调用close()
,或者远程端关闭/终止连接,可以依靠此方法进行本地清理。