文章
- 使用MulticastSocket实现多点广播
创建MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,MulticastSocket使用joinGroup()方法加入指定组;使用leaveGroup()方法脱离一个组。 1、joinGroup(InetAddress multicastAddr):将该MulticastSocket加入指定的多点广播地址。 2、leaveGroup(InetAddress multicastAddr):让该MulticastSocket离开指定的多点广播地址。 - MulticastSocket绑定端口的问题 说一下端口冲突的问题。因为使用的是UDP协议,所以MulticastSocket是可以实现多个对象,重复绑定同一个端口的。至少在我目前测试的结果,这样子做是合法的。
本地验证
1. 同一台机器,开启UDP组播消息监听,可以创建多个组播Socket,监听同一端口,不存在类似TCP的端口占用问题
2. 同一台机器:
UDP组播监听的端口,和TCP监听的端口,端口可以重复/共享,不存在独占性;
TCP监听的端口之间,存在独占性,不可重复; 重复监听同一端口会报异常:
W/System.err: java.net.BindException: bind failed: EADDRINUSE (Address already in use)
W/System.err: at libcore.io.IoBridge.bind(IoBridge.java:108)
W/System.err: at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:162)
W/System.err: at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:427)
W/System.err: at java.net.ServerSocket.bind(ServerSocket.java:377)
3. 两台设备已经处于一个局域网
-
A开热点,B加入该热点
C:\Users\***>adb shell 机型:/ $ ifconfig wlan0 Link encap:UNSPEC Driver wlan inet addr:192.168.52.204 Bcast:192.168.52.255 Mask:255.255.255.0 inet6 addr: fe80::380e:9aff:fe67:2261/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:281 errors:0 dropped:0 overruns:0 frame:0 TX packets:455 errors:1 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:22985 TX bytes:35002 lo Link encap:UNSPEC inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope: Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1080 TX bytes:1080 dummy0 Link encap:UNSPEC inet6 addr: fe80::6cc6:4aff:feb3:1327/64 Scope: Link UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:12 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 TX bytes:840 机型:/ $ C:\Users\***>adb shell 机型:/ $ ifconfig dummy0 Link encap:UNSPEC inet6 addr: fe80::fc0c:3fff:fe4c:9f23/64 Scope: Link UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 TX bytes:630 lo Link encap:UNSPEC inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope: Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1080 TX bytes:1080 ap0 Link encap:UNSPEC inet addr:192.168.52.185 Bcast:192.168.52.255 Mask:255.255.255.0 inet6 addr: fe80::24e2:f9ff:fed5:695e/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:493 errors:0 dropped:0 overruns:0 frame:0 TX packets:293 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:37614 TX bytes:24123 wlan0 Link encap:UNSPEC Driver wlan UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:653 errors:0 dropped:0 overruns:0 frame:0 TX packets:748 errors:2 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:50869 TX bytes:57972 机型:/ $ C:\Users\***>- 这种情况下,两台设备发送UDP组播消息,都应该向 Bcast: 这个IP发送才行. 否则会出现开启热点的机器发送组播消息报网络异常: unreachable**
- 开启热点的机器获取自身 ap0的Bcast, 加入热点的机器获取自身 wlan0的Bcast . 或者两者可以获取inet addr,然后取前三位+255 拼接.
-
A和B都加入同一wifi.
- 这种情况两台设备可以采用固定的'组播IP': 239.0.0.101 .就可以实现彼此UDP通讯.