2014-10-22 139 views
-1

我一直在试图找出如何在客户端强制终止连接或者客户端一般失去连接时调用方法。目前,我的所有在线帐户都有一个列表<>,但如果玩家没有自然退出服务器,该帐户将保留在列表中。Netty - 调用连接终止的方法

我一直在寻找的文件,并在几十种不同的方式搜索谷歌措辞我的问题,但我找不到我正在寻找的答案。

基本上,我需要一种方法来确定哪个通道已断开连接,并将其作为参数传递给方法,这可能吗?它几乎必须是。

回答

1

我想这可以在客户端和服务器端使用线程来完成。

在客户端类中设置一个Date变量lastActive,每隔5min由客户端设置一次(比方说)。另一个线程将每10分钟从服务器端运行一次以检查此标志,如果lastActive超过10分钟,则从列表中删除播放器。您可以根据需要更改此频率时间

+0

我想过这样做,但是如果在多人团队突袭期间玩家在10分钟检查后一分钟后断开连线,他将无法再登录9分钟,因为他的“帐户已登录。“?这听起来不太有效。当连接强制关闭时会抛出异常,但我无法弄清楚它是哪个异常,(我想我不会再抛弃它了,但我曾经这么做) – Hobbyist 2014-10-22 19:24:51

0

可靠地检测套接字断开连接是一个常见问题,并非Netty特有的。您所描述的问题是您的对等方可能无法可靠地终止其连接的结束。例如:对等失去能力,对等应用程序崩溃,对等机器崩溃等等......一种常见的解决方案是关闭连接,如果没有检测到读取活动超过一段时间间隔。 Netty提供了一些实用程序来缓解此过程,例如ReadTimeoutHandler。设置时间间隔是特定于应用程序的,并取决于您的协议。如果您希望的时间间隔足够小,您可能需要在协议中添加额外的消息以作为心跳消息(一个简单的请求/响应以指示每一方正在相互通话)。

从Netty特定的角度来看,您可以注册一个收听者频道的CloseFuture,当频道关闭时会通知您。如果按照前面所述设置ReadTimeoutHandler,那么在超时间隔过去并且没有检测到活动或通道正常关闭后,您将收到关闭事件的通知。

+0

@ Christian.tucker - 任何想法或问题吗?这不是你要找的答案吗? – 2014-10-28 01:17:52