最近试着给DTPLink网络通讯层加上UDP Multicast(IP组播)来实现类似uPNP的SSDP和Bonjour的mDNS功能。Multicast本是用来实现网络上属于同一组播组的主机间通讯,可以实现局域网内和因特网上的组播通讯。网上示例代码很多,但我的试验基本没有成功过。在试验过程中发现TP-Link低端家用路由器并不支持组播报文的转播,所以跨因特网的组播基本上是无法验证的。在Amzon EC2的Instance间也尝试了一把,最后发现Amzon EC2的官方文档中也指明了不支持组播。还尝试了局域网内的组播,理论上局域网内的组播是不需要到路由器上转发的,遗憾的是不论怎么尝试都没有成功。。。。百思不得其解。最后我试着用uPNP的"239.255.255.255:1900"地址试了一把,发现能够从开启upnp功能的路由器上得到SSDP协议的信息,同时侦听在该地址上的两个无线设备(一台笔记本+一台Android手机)间能够实现组播通讯,但是并不稳定,接收端有时收不到报文,从这个结果来看,家庭网络内部如果要用上组播技术,要么需要一个功能更高级的路由器(更多钱),要么尝试用uPNP。Multicast(组播或多播)虽然较Broadcast(广播)有技术上的优势,但还是增加网络通讯负担,所以即使家用路由器支持组播转发,在ISP那端也很有可能把组播转发功能给关了。因此组播在实际应用中还是些限制。本次试验的代码来自这里。
注意,Android系统为了省电,默认情况是关闭组播通讯的,用multicastsocket编程时要事先通过Wifimanager得到MulticastLock方可操作。