Netty - UDP服务器

the*_*ost 4 java udp netty

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

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

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

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

  1. 难道我做错了什么 ?
  2. 是否有更好的回写方式,而不是将频道和远程地址保留在某个成员中?

小智 5

当使用UDP(数据报)通道作为服务器通道时,只将其绑定在本地地址上,并且不进行任何连接.这就是为什么没有与频道相关的远程地址,而且你总是null在通话时得到MessageEvent.getChannel().getRemoteAddress().这种行为是预期和正确的.相同的单个UDP"服务器"通道处理所有传入的客户端请求.

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

我想你有两个选择:

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

我相信第一种选择更好.