我有一个基于UDP Netty的服务器。它有一个SimpleChannelUpstreamHandler
流水线,我重写了messageReceived
方法。
我需要不时地写一些信息。我只能通过使用MessageEvent.getRemoteAddress()
中的套接字信息和MessageEvent.getChannel()
中的 channel 来做到这一点。为了能够重用此信息,我将其保存在静态 map 中。
这变成MessageEvent.getChannel().write("foo", MessageEvent.getRemoteAddress());
我本来希望可以使用MessageEvent.getChannel().getRemoteAddress()
,但事实并非如此。它总是给我null
。
最佳答案
当使用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 正常运行,只要它保存远程地址即可。
我认为您有两种选择:
我相信第一个选择会更好。
关于java - Netty-UDP服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17321850/