Java多播:如何在localhost上进行测试?

时间:2019-03-22 22:45:10

标签: java sockets networking port multicast

我正在尝试使用客户端和多台服务器在Java中实现多播应用程序。客户端将通过MultiacastSocket发送数据报,并且所有将加入一个组的服务器都应接收该数据包。然后,所有服务器都应采取措施,并向客户端返回单播答案。像这样:enter image description here

我的实现看起来像这样,客户端有一个MulticastSocket,而服务器只有DatagramSockets。对我来说,最大的问题是,如何设置服务器的组ID和端口号,以便可以在本地进行测试?我尝试在客户端和服务器上使用不同的端口,并使用相同的组ID localhost,但这不起作用。 还尝试了socket.setLoopbackMode()socket.setInterface(InetAddress.getLoopbackAddress())。但是我被困在某个地方,一些建设性的投入会很棒。

1 个答案:

答案 0 :(得分:0)

不幸的是,它取决于平台。您可以尝试将发送和接收套接字绑定到回送接口,但是里程会有所不同。此技巧适用于Windows,在某种程度上取决于网络的设置。经过一系列奥秘的参数调整后,我在SUSE Linux上运行了它,但这至少是在十年前。

环回接口 是特殊的(例如,通常是更高的MTU,仅在软件中实现,将传出的消息直接移入传入的队列等),因此有时不适用正常的联网规则。

一件事可以在所有平台上统一工作,以使用物理网络并对出站数据包施加限制。为了进行测试,我通常采用的一个技巧是将传出数据包的TTL设置为1(MulticastSocket.setTimeToLive(1);)。这样,数据包就不会经过任何路由器。另外,您将需要确保在同一子网中执行的其他测试不会干扰您的子网。我通常通过在224.1.1.1和239.254.254.254之间生成一个地址,将随机化器用于多播地址。该地址空间应足够大以避免冲突。您还需要确保随机化器避免使用reserved多播地址,否则各种奇怪的行为可能会开始在您的环境中弹出。

也有MulticastSocket.setLoopbackMode(boolean),但我发现它也依赖于平台(尽管不如使用环回那么严格,而且公平的是,它在一段时间之前,现在可能会更好),因此可能需要对操作系统进行一些调整。