我有一个基于UDP Netty的服务器。它有一个SimpleChannelUpstreamHandler流水线,我重写了messageReceived方法。

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

这变成MessageEvent.getChannel().write("foo", MessageEvent.getRemoteAddress());
我本来希望可以使用MessageEvent.getChannel().getRemoteAddress(),但事实并非如此。它总是给我null

  • 我做错什么了吗?
  • 是否有比在某些成员中保留 channel 和远程地址更好的回写方法?
  • 最佳答案

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

    当使用UDP channel 作为客户端 channel 时,可以通过将 channel 连接到远程地址来创建“连接”。在这种情况下, channel 将具有配置的远程地址(尽管未建立实际连接),并且调用MessageEvent.getChannel().getRemoteAddress()将返回配置的远程地址。
    连接UDP channel 会阻止用户使用该 channel 将数据发送到该 channel 上配置的远程地址以外的其他远程地址。尝试这样做将引发异常。连接客户端 channel 是UDP中的可选操作,客户端可以使用仅绑定(bind)到本地地址的 channel 正常运行,只要它保存远程地址即可。

    我认为您有两种选择:

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

  • 我相信第一个选择会更好。

    关于java - Netty-UDP服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17321850/

    10-11 03:35
    查看更多