【问题标题】:Netty - UDP serverNetty - UDP 服务器
【发布时间】:2013-07-05 23:19:29
【问题描述】:

我有一个基于 UDP Netty 的服务器。它有一个SimpleChannelUpstreamHandler 流水线,我在其中覆盖了messageReceived 方法。

我需要不时写回一些信息。我只能通过使用来自MessageEvent.getRemoteAddress() 的套接字信息和来自MessageEvent.getChannel() 的通道来做到这一点。为了能够重用这些信息,我将这些信息保存在静态地图中。

这变成MessageEvent.getChannel().write("foo", MessageEvent.getRemoteAddress());

我所期望的是让MessageEvent.getChannel().getRemoteAddress() 工作,但事实并非如此。它总是给我null

  1. 我做错了吗?
  2. 有没有比在某些成员中保留频道和远程地址更好的回写方式?

【问题讨论】:

    标签: java udp netty


    【解决方案1】:

    当使用 UDP(数据报)通道作为服务器通道时,您只需将其绑定到本地地址,并且不会建立连接。这就是为什么没有与通道关联的远程地址,并且在调用MessageEvent.getChannel().getRemoteAddress() 时总是得到null。这种行为是预期的并且是正确的。同一个 UDP“服务器”通道处理所有传入的客户端请求。

    当使用 UDP 通道作为客户端通道时,可以通过将通道连接到远程地址来创建“连接”。在这种情况下,通道将具有配置的远程地址(尽管没有建立实际连接),调用MessageEvent.getChannel().getRemoteAddress() 将返回配置的远程地址。 连接 UDP 通道可防止用户使用该通道向远程地址发送数据,而不是在通道上配置的地址。尝试这样做会引发异常。 UDP中连接客户端通道是可选的,客户端只要保存了远程地址,就可以正常使用只绑定在本地地址的通道。

    我认为你有两个选择:

    1. 使用客户端标识符保存客户端远程地址并使用“服务器”通道发送数据。保存通道将不起作用,因为同一个通道将用于与所有客户端进行通信。
    2. 为每个客户端创建一个新的连接通道,并使用客户端标识符保存新通道。

    我相信第一个选项更好。

    【讨论】:

      【解决方案2】:

      您可能知道 UDP 是一种无连接传输。单个通道可以从任何目标地址接收数据并将数据写入任何目标地址。因此,UDP 通道不像 TCP 通道那样具有关联的远程地址。虽然我认为可以让 netty 将 UDP 通道与特定的远程地址相关联,但我没有手头的详细信息,老实说,我认为从消息事件中获取地址是更好的选择。

      这导致了您的第二个问题,是的,您需要将远程地址保存在某个地方。我没有在 Netty 中进行任何 UDP 编程,所以我不确定是否需要将远程地址映射到通道对象,或者 Netty 是否总是返回相同的通道对象。值得检查一下,因为您可能只需要保留一个对频道的引用。

      【讨论】:

      • 谢谢!不过,我所期望的是通过 Channel 获得远程地址以供以后使用。如果这不切实际,也许抛出不受支持的操作异常会更好。关于频道引用,我不确定我是否做得对。我期待多个客户端连接,每个客户端都发送一些数据以及唯一的客户端标识符。我将频道映射到这个唯一标识符。想法?
      【解决方案3】:

      1) 看看这个UDP upstream handler。要获取发件人的远程地址,您可以使用以下代码SocketAddress remoteAddress = datagramPacket.sender();
      2)@johnstlr 提到的是正确的,将 UDP 通道与单个远程地址相关联是不正确的。但是您可以使用并发 hashmap 进行查找,如上述文件所示。这个game server 实际上使用了同时具有 TCP 和 UDP 连接的会话。这使得通过 TCP 发送可靠数据和通过 UDP 发送所有帧数据变得容易。

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 1970-01-01
        • 2019-03-26
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多