- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用客户端和多个服务器在 Java 中实现多播应用程序。客户端将通过 MultiacastSocket 发送数据报,所有加入组的服务器都应该接收该数据包。然后所有服务器都应该做一些事情并向客户端返回单播答案。像这样:
我的实现看起来像这样,客户端有一个 MulticastSocket,服务器只有 DatagramSocket。对我来说最大的问题是,如何设置服务器的组 ID 和端口号,以便我可以在本地进行测试?我尝试在客户端和服务器上使用不同的端口以及相同的组 ID localhost
,但这不起作用。还尝试了socket.setLoopbackMode()和socket.setInterface(InetAddress.getLoopbackAddress())。但我被困在某个地方,一些建设性的意见会很棒。
最佳答案
不幸的是,它依赖于平台。您可以尝试将发送和接收套接字绑定(bind)到环回接口(interface),但效果会有所不同。此技巧适用于 Windows,具体取决于您的网络设置方式。经过一系列神秘的参数调整后,我让它在 SUSE Linux 上运行,但这至少是十年前的事了。
环回接口(interface)很特殊(例如,通常更高的MTU、纯粹在软件中实现、传出消息直接移入传入队列等),因此有时正常的网络规则不适用。
跨平台统一工作的一件事是使用物理网络并对传出数据包施加限制。为了进行测试,我通常采用的一个技巧是将传出数据包的 TTL 设置为 1 (MulticastSocket.setTimeToLive(1);
)。这样,数据包就不会通过任何路由器。此外,您还需要确保在同一子网上执行的其他测试不会干扰您的测试。为此,我通常使用多播地址随机发生器生成 224.1.1.1 和 239.254.254.254 之间的地址。该地址空间应该足够大以避免冲突。您还需要确保您的随机发生器避免 reserved多播地址或各种奇怪的行为可能会开始在您的环境中出现。
还有 MulticastSocket.setLoopbackMode(boolean)
,但我发现它也依赖于平台(尽管不像使用环回那么严重,而且公平地说,这是很久以前的事了,现在可能会工作得更好),因此可能需要对操作系统进行一些调整。
关于Java多播: How to test on localhost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308730/
我是一名优秀的程序员,十分优秀!