Java Netty-UDP服务器

Java Netty-UDP服务器,java,udp,netty,Java,Udp,Netty,我有一个基于UDP网络的服务器。它有一个管道化的SimpleChannelUpstreamHandler,其中我覆盖了messageReceived方法 我需要时不时地写一些信息。我只能通过使用MessageEvent.getRemoteAddress()中的套接字信息和MessageEvent.getChannel()中的频道来实现这一点。为了能够重用这些信息,我将其保存在静态映射中 这将变成MessageEvent.getChannel().write(“foo”,MessageEvent.

我有一个基于UDP网络的服务器。它有一个管道化的
SimpleChannelUpstreamHandler
,其中我覆盖了
messageReceived
方法

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

这将变成
MessageEvent.getChannel().write(“foo”,MessageEvent.getRemoteAddress())

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

  • 我做错什么了吗
  • 有没有比将通道和远程地址保存在某个成员中更好的写回方法

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

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

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

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

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

    我认为你有两个选择:

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

  • 我相信第一种选择更好。

    谢谢!不过,我原本希望通过通道获得远程地址,以供以后使用。如果这不实际,那么抛出一个不受支持的操作异常可能会更好。关于频道引用,我不确定我是否做对了。我期望多个客户端连接,每个客户端发送一些数据以及唯一的客户端标识符。我将频道映射到此唯一标识符。思想?