我使用MulticastSocket在我的Android启用开发板(版本4.3)上有一个工作的多播接收器;我想要的是能够使用NIO频道。由于Android中不存在MulticastChannel,因此到目前为止,我已经尝试使用DatagramChannel而没有任何运气。如果任何人有任何关于配置频道只进行多播接收的信息,那就太棒了!
下面是一些不起作用的示例代码,但会对我如何进行设置提供一般性的想法:
InetAddress groupAddr = InetAddress.getByName(groupAddress); SelectorProvider provider = SelectorProvider.provider(); Selector selector = provider.openSelector(); DatagramChannel dc = DatagramChannel.open(); // this cast fails MulticastSocket socket = (MulticastSocket) dc.socket(); // set ttl socket.setTimeToLive(16); // set receive buffer socket.setReceiveBufferSize(65536); socket.setReuseAddress(true); // join group socket.joinGroup(groupAddr);
产生这个(我有点期待):
11-14 18:11:56.203: E/AndroidRuntime(22315): FATAL EXCEPTION: DatagramListener 11-14 18:11:56.203: E/AndroidRuntime(22315): java.lang.ClassCastException: java.nio.DatagramChannelImpl$DatagramSocketAdapter cannot be cast to java.net.MulticastSocket
答案 0 :(得分:2)
工作代码。 _pairChannelAndSocket()方法
public class Sample
{
private DatagramChannel createChannel(NetworkInterface networkIf, InetSocketAddress address)
throws IOException {
MulticastSocket socket = new MulticastSocket(address.getPort());
socket.setReuseAddress(true);
socket.setBroadcast(true);
socket.joinGroup(MCAST_ADDRESS, networkIf);
DatagramChannel channel = DatagramChannel.open();
_pairChannelAndSocket(channel, socket);
channel.configureBlocking(false);
return channel;
}
public static void _pairChannelAndSocket(DatagramChannel channel, MulticastSocket socket) {
try {
Field f = channel.getClass().getDeclaredField("socket");
f.setAccessible(true);
f.set(channel, socket);
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
}
答案 1 :(得分:1)
我还没有尝试过,但是这里有一些关于使用反射的想法:
java.nio.DatagramChannelImpl$DatagramSocketAdapter
class DatagramSocket
- 通过包装实际的DatagramChannelImpl
channelImpl
属性,即实际的DatagramChannelImpl
DatagramChannelImpl
实例,您可以加入/离开多播组或者,也许可以尝试使用DatagramSocket.setDatagramSocketImplFactory
为您的自定义工厂分配配置了多播的套接字实现。或者生成在其适配器中公开实际“Impl”对象的套接字实现。