Mercurial > hg > Members > kono > WifiBroadcast
view src/wifibroadcast/WifiBroadcast.java @ 3:9c99e2193277
find broadcast
author | one |
---|---|
date | Sat, 28 Jul 2012 18:15:13 +0900 |
parents | 2a328333ba70 |
children | 404778ac3f55 |
line wrap: on
line source
package wifibroadcast; import java.net.NetworkInterface; import java.io.IOException; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.InterfaceAddress; import java.net.SocketException; import java.net.StandardSocketOptions; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; import java.util.Enumeration; import java.util.Iterator; public class WifiBroadcast implements WifiReceiver { private DatagramChannel channel; private Selector selector; private DatagramSocket s; public WifiBroadcast(int port, SocketType sender) throws IOException { selector = SelectorProvider.provider().openSelector(); channel = SelectorProvider.provider().openDatagramChannel(); s = channel.socket(); channel.setOption(StandardSocketOptions.SO_REUSEADDR, true); channel.configureBlocking(false); if (sender == SocketType.Sender) { s.setBroadcast(true); try { InetAddress address0 = getBroadcast(); System.out.println("Found broadcast "+address0); InetSocketAddress address = new InetSocketAddress(address0, port); channel.connect(address); } catch (SocketException e) { // for some bad IPv6 implementation channel.connect(new InetSocketAddress(port)); } } else { try { InetSocketAddress address = new InetSocketAddress("::", port); channel.connect(address); } catch (SocketException e) { // for some bad IPv6 implementation channel.connect(new InetSocketAddress(port)); } } channel.register(selector, SelectionKey.OP_READ); } public void recieve(ByteBuffer testData, long timeout) throws IOException { if (selector.select(timeout)>0) { for (Iterator<SelectionKey> it = selector.selectedKeys().iterator();it.hasNext(); ) { SelectionKey s = it.next(); it.remove(); DatagramChannel ch = (DatagramChannel)s.channel(); ch.read(testData); testData.flip(); return; // one at a time } } else { System.out.println("receiver time out"); testData.position(0); testData.limit(0); } } public InetAddress getBroadcast() throws SocketException { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface networkInterface = interfaces.nextElement(); if (networkInterface.isLoopback()) continue; // Don't want to broadcast to the loopback interface for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) { InetAddress broadcast = interfaceAddress.getBroadcast(); if (broadcast == null) continue; // Use the address return broadcast; } } throw new SocketException(); } public void send(ByteBuffer testData) throws IOException { int out = channel.write(testData); System.out.println("send "+out+" bytes."); } }