Java 在Netty 4中检测关闭的客户端UDP通道

Java 在Netty 4中检测关闭的客户端UDP通道,java,udp,netty,Java,Udp,Netty,我使用Netty作为UDP服务器的一部分,该服务器在单个服务器通道上打开与各种客户端的多个持久连接。当客户端终止连接时,我需要执行一些清理。具体地说,我需要知道连接何时终止以及终止客户端位于哪个IP地址,以便我可以清理数据 也许我误解了Netty模型,但我不确定如何检测它。我通常通过从DatagramPacket实例中检查发送方的IP地址来区分不同的客户端,也许这是错误的,我应该使用多个通道或类似的东西?无论哪种方式,我都在寻找处理封闭连接的方法。你误解了UDP,而不是Netty。UDP中没有“

我使用Netty作为UDP服务器的一部分,该服务器在单个服务器通道上打开与各种客户端的多个持久连接。当客户端终止连接时,我需要执行一些清理。具体地说,我需要知道连接何时终止以及终止客户端位于哪个IP地址,以便我可以清理数据



也许我误解了Netty模型,但我不确定如何检测它。我通常通过从
DatagramPacket
实例中检查发送方的IP地址来区分不同的客户端,也许这是错误的,我应该使用多个通道或类似的东西?无论哪种方式,我都在寻找处理封闭连接的方法。

你误解了UDP,而不是Netty。UDP中没有“持久连接”这类东西,尽管可以有应用程序管理的会话,并且UDP不提供关于另一个端点是否仍然处于活动状态的信息。理想情况下,您将有一条“关闭”消息,但您需要有一个超时或其他机制来识别死连接并清除它们(对于崩溃的客户端等)。这将需要某种垃圾收集过程,可能是一个后台线程,用于检查“上次听到的消息”时间戳并关闭非活动会话。

您误解了UDP,而不是Netty。UDP中没有“持久连接”这类东西,尽管可以有应用程序管理的会话,并且UDP不提供关于另一个端点是否仍然处于活动状态的信息。理想情况下,您将有一条“关闭”消息,但您需要有一个超时或其他机制来识别死连接并清除它们(对于崩溃的客户端等)。这将需要某种垃圾收集过程,可能是一个后台线程,用于检查“上次听到的消息”时间戳并关闭非活动会话。

您误解了UDP,而不是Netty。UDP中没有“持久连接”这类东西,尽管可以有应用程序管理的会话,并且UDP不提供关于另一个端点是否仍然处于活动状态的信息。理想情况下,您将有一条“关闭”消息,但您需要有一个超时或其他机制来识别死连接并清除它们(对于崩溃的客户端等)。这将需要某种垃圾收集过程,可能是一个后台线程,用于检查“上次听到的消息”时间戳并关闭非活动会话。

您误解了UDP,而不是Netty。UDP中没有“持久连接”这类东西,尽管可以有应用程序管理的会话,并且UDP不提供关于另一个端点是否仍然处于活动状态的信息。理想情况下,您将有一条“关闭”消息,但您需要有一个超时或其他机制来识别死连接并清除它们(对于崩溃的客户端等)。这将需要某种类型的垃圾收集过程,可能是一个后台线程,用于检查“上次听到的消息”时间戳并关闭非活动会话。

我开始怀疑这一点,谢谢,现在您指出这一点是有道理的。如果需要很长时间才能回复,简单地ping一个没有响应的客户并杀死它是否明智?@JakeKing最好要求客户发送keepalives。我相信你的话,不过你能简单地解释一下为什么这样更好吗?由于客户端可能会有很多流量,因此拨动安静的流量似乎会更有效。@JakeKing如果客户端主动发送数据,则不必发送keepalives,但有几个原因,都是效率/可伸缩性,会给客户端带来负担。基本上,两端都知道服务器需要更新,所以“客户端ping”只会增加服务器端的复杂性和额外流量。如果客户端要响应ping,它无论如何都会发送keepalive(或另一条消息),现在每个客户端上都有一个1秒的计时器线程,而不是服务器上的大量额外簿记。事实上,您需要完全停止在UDP中考虑客户端。有一个请求和一个响应。该客户机在请求/响应之外没有任何上下文。你可能再也听不到他的消息了。我开始怀疑这一点,谢谢,现在你指出这一点是有道理的。如果需要很长时间才能回复,简单地ping一个没有响应的客户并杀死它是否明智?@JakeKing最好要求客户发送keepalives。我相信你的话,不过你能简单地解释一下为什么这样更好吗?由于客户端可能会有很多流量,因此拨动安静的流量似乎会更有效。@JakeKing如果客户端主动发送数据,则不必发送keepalives,但有几个原因,都是效率/可伸缩性,会给客户端带来负担。基本上,两端都知道服务器需要更新,所以“客户端ping”只会增加服务器端的复杂性和额外流量。如果客户端要响应ping,它无论如何都会发送keepalive(或另一条消息),现在每个客户端上都有一个1秒的计时器线程,而不是服务器上的大量额外簿记。事实上,您需要完全停止在UDP中考虑客户端。有一个请求和一个响应。该客户机在请求/响应之外没有任何上下文。你可能再也听不到他的消息了。我开始怀疑这一点,谢谢,现在你指出这一点是有道理的。如果需要很长时间才能回复,简单地ping一个没有响应的客户并杀死它是否明智?@JakeKing最好要求客户发送keepalives。我相信你的话,不过你能简单地解释一下为什么这样更好吗?由于客户端可能会有大量的流量,因此拨动安静的流量似乎会更有效。@JakeKing如果客户端主动发送数据,则不必发送keepalives,但有几个原因,即效率/可伸缩性