Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转发多播IP的端口_Java_Networking_Multicast_Portforwarding_Multicastsocket - Fatal编程技术网

Java 转发多播IP的端口

Java 转发多播IP的端口,java,networking,multicast,portforwarding,multicastsocket,Java,Networking,Multicast,Portforwarding,Multicastsocket,我花了一些时间学习UDP连接,特别是Java中的多播套接字 我能够在我的本地网络上创建一个简单的多播套接字“群聊”,但我一直在尝试将其扩展到我的本地网络之外 为了实现这一点,我在路由器上转发了一个D类IP地址,以允许其他人从网络外部访问我的多播组 但是,当尝试通过我的公共IP和指定端口(在端口转发期间)连接到我的“群聊”时,我会收到以下错误消息 Exception in thread "main" java.net.SocketException: Not a multicast address

我花了一些时间学习UDP连接,特别是Java中的多播套接字

我能够在我的本地网络上创建一个简单的多播套接字“群聊”,但我一直在尝试将其扩展到我的本地网络之外

为了实现这一点,我在路由器上转发了一个D类IP地址,以允许其他人从网络外部访问我的多播组

但是,当尝试通过我的公共IP和指定端口(在端口转发期间)连接到我的“群聊”时,我会收到以下错误消息

Exception in thread "main" java.net.SocketException: Not a multicast address
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:310)
...
考虑到我的公共IP不是D类地址,这个错误是有道理的。但是,既然我将一个多播地址转发到路由器上的指定端口,这个问题不应该发生吗

这是我代码的相关部分

InetAddress group = InetAddress.getByName("192.___.___.___"); // my public IP
MulticastSocket socket = new MulticastSocket(1234); // the port-forwarded port
socket.joinGroup(group);

我在这里哪里出错了,我如何解决这个问题?

多播地址位于
224.0.0
-
239.255.255.255
之间,在不同的场景中具有不同的子范围。详情如下:

因此,通过尝试加入位于
192.x.y.z
的组,这是一个无效的多播地址。这就是为什么会抛出异常

我可能弄错了,我怀疑大多数消费者/家庭NAT,更不用说ISP支持多播流量了。(回避了这些问题——不管MBONE发生了什么——我原以为这一切都会得到解决。)

听起来您需要的是一个代理程序,它可以拦截多播流量并将其通过隧道传输到运行相同代码的不同网络上的代理。代理依次获取隧道数据包并重定向回一个多播\广播组


使用广播套接字而不是多播可能会更好。

多播路由与单播路由有很大不同。多播仅限于单个LAN,除非路径中的所有路由器都配置了多播路由,这就是您无法在Internet上多播的原因。端口转发用于单播NAPT,而不是多播。如果通过Internet进行隧道传输,您可以在站点之间使用多播,但并非所有的隧道协议都支持多播。
听起来您需要的是一个代理程序,它可以拦截多播流量,并将其通过隧道传输到运行相同代码的不同网络上的代理。
同样的问题可能会出现。android仍然会因为地址不符合标准范围而窒息。很烦人的问题。