【发布时间】:2023-03-20 04:50:01
【问题描述】:
我一直在试图弄清楚当连接被客户端强行终止时,或者客户端通常失去连接时如何调用方法。目前我有一个我所有在线帐户的列表,但是如果玩家没有自然退出服务器,该帐户将保留在列表中。
我一直在查看文档,并以几十种不同的方式搜索谷歌措辞我的问题,但我找不到我正在寻找的答案。
基本上,我需要一种方法来确定哪个通道断开连接,并将其作为参数传递给方法,这可能吗?几乎必须如此。
【问题讨论】:
我一直在试图弄清楚当连接被客户端强行终止时,或者客户端通常失去连接时如何调用方法。目前我有一个我所有在线帐户的列表,但是如果玩家没有自然退出服务器,该帐户将保留在列表中。
我一直在查看文档,并以几十种不同的方式搜索谷歌措辞我的问题,但我找不到我正在寻找的答案。
基本上,我需要一种方法来确定哪个通道断开连接,并将其作为参数传递给方法,这可能吗?几乎必须如此。
【问题讨论】:
可靠地检测套接字断开是一个常见问题,并非 Netty 独有。您描述的问题是您的对等方可能无法可靠地终止他们的连接结束。例如:peer 断电、peer 应用程序崩溃、peer 机器崩溃等......一种常见的解决方案是如果超过某个时间间隔没有检测到读取活动,则关闭连接。 Netty 提供了一些实用程序来简化此过程,例如ReadTimeoutHandler。设置时间间隔是特定于应用程序的,将取决于您的协议。如果您想要的时间间隔足够小,您可能需要在协议中添加额外的消息以用作心跳消息(一个简单的请求/响应,表明双方正在相互交谈)。
从 Netty 特定的角度来看,您可以使用 Channel 的 CloseFuture 注册一个侦听器,该侦听器将在通道关闭时通知您。如果您按照前面所述设置 ReadTimeoutHandler,那么您将在超时间隔过后收到关闭事件的通知,并且未检测到任何活动或通道正常关闭。
【讨论】:
我想这可以在客户端和服务器端使用线程来完成。
在客户端类中创建一个 Date 变量 lastActive,它将由客户端每 5 分钟设置一次(比方说)。另一个线程将每 10 分钟从服务器端运行一次以检查此标志,如果 lastActive 超过 10 分钟,则从列表中删除播放器。您可以根据需要更改此频率时间
【讨论】: