Java 7增加NIO multicast的支持, netty 4中也增加了对multicast的支持: Issue #216。
实际在使用中需要对环境和Netty的代码进行相应的配置。
检查Linux环境是否支持multicast
运行ifconfig -a
, 如果在输出中有如下的信息,则当前的内核支持multicast。
|
|
如果没有这样的信息, 尝试下面的命令
|
|
再运行ifconfig -a
, 如果的确没有UP BROADCAST RUNNING MULTICAST
, 需要重新编译内核。
设置内核配置如下:
- CONFIG_IP_MULTICAST=y
- CONFIG_IP_ROUTER=y
- CONFIG_IP_MROUTE=y
- CONFIG_NET_IPIP=y
默认Red Hat / Fedora/ Cent OS内核都支持multicast。
配置多播路由
命令route -n
可以查看配置的路由信息。
|
|
或者/sbin/ip route show
|
|
如果你的网卡或者lo没有配置224.0.0.0
这样的行, 需要配置:
|
|
我在本机测试, 这里使用的是lo本地回环接口 (local loopback interface)。
移除路由
|
|
你可以在/etc/rc.d/rc.local
中加上下面的一行, 这样服务器每次启动会自动配置路由。
|
|
IPv4 多播地址由1110
开始, 这类地址为D类地址。 CIDR为 224.0.0.0/4. 包含的地址范围为 224.0.0.0 到 239.255.255.255. RFC 5771 和IETF BCP 51对地址有相应的定义.240.0.0.0
二进制形式为11110000 00000000 00000000 00000000
。
检查多播地址netstat -gn
输出
|
|
可以看到224.0.0.1
这个IP地址。
Netty的多播设置
Netty下UDP多播的设置和UDP单播基本类似,只是增加了额外的参数。
Netty本身提供了多播的单元测试, 可以参考应用,非常简单。
|
|
如果你的多播地址绑定的网卡不是lo回环接口, 你需要用你绑定的网卡设置sb.option(ChannelOption.IP_MULTICAST_IF, NetUtil.LOOPBACK_IF);