【问题标题】:Howto get some ID for a Netty Channel?如何获取 Netty 频道的 ID?
【发布时间】:2014-03-20 07:59:23
【问题描述】:

Channel.id() 已在 Netty 4.0.0.CR9 中删除。

这些天我如何获得频道的 ID?

我曾经在我的所有处理程序中使用 id() 进行日志记录(例如 System.out.println(ctx.channel().id() + " - readableBytes(): " + in.readableBytes()) )。

我不能依赖 Channel 的 toString 方法,因为它可能会被覆盖。

【问题讨论】:

    标签: netty


    【解决方案1】:

    如果您确定频道处于活动状态,您可以通过组合hashCode()remoteAddress()localAddress() 来生成频道的唯一ID。或者,您可以简单地使用 Channel.toString() 从三个属性生成一个字符串。如果频道尚未激活,remoteAddress()localAddress() 将不会提供有意义的信息,因此您仍有碰撞风险。

    Netty 4.1 和 5.0 重新引入了Channel.id(),它返回了一个名为ChannelId 的新类型。它使用 MAC 地址、当前 PID、时间戳和哈希码等各种信息,因此它甚至可以用作全球唯一 ID。检查Javadoc

    【讨论】:

    • 这是最完整的答案。 Netty 4 不再拥有它,但您可以通过组合获得它,而 Netty 5 将再次拥有它。谢谢。
    • Netty 4.1 也有。
    • 使用 Channel.toString 作为 id 时要小心,因为当频道处于非活动状态时它会发生变化github.com/netty/netty/blob/4.0/transport/src/main/java/io/…
    【解决方案2】:

    您可以使用 Channel.hashCode() 。我们删除了 id(),因为它不能保证 100 % 唯一。

    【讨论】:

    • hashCode 也不能保证返回唯一值,是吗?
    • hashCode() 不保证返回唯一值。我仍然建议使用Channel.toString()。所有Channel 实现实际上都依赖于AbstractChannel.toString()
    • @trustin:toString 方法包含远程地址,使其唯一。您可以将其发布为答案吗?有时间我会看看你无法检索远程地址的情况。
    • @AndrewBourgeois 答案已更新。感谢您的反馈。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 2020-08-12
    • 2019-12-14
    • 2012-12-31
    • 2021-10-28
    • 2019-12-07
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多