view src/wifibroadcast/WifiBroadcastReciver.java @ 0:df9d16620c08

Wifi broad cast test program
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 28 Jul 2012 12:16:49 +0900
parents
children
line wrap: on
line source

package wifibroadcast;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.spi.SelectorProvider;
import java.util.Iterator;

import fdl.TupleHandler;

public class WifiBroadcastReciver  implements WifiReciver {

	private DatagramChannel channel;
	private Selector selector;

	public WifiBroadcastReciver(int port) throws IOException {
		selector = SelectorProvider.provider().openSelector();		
		channel = SelectorProvider.provider().openDatagramChannel();
		channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
		try {
			InetSocketAddress address = new InetSocketAddress("::", port);
			channel.socket().bind(address);		
		} catch (SocketException e) {
			// for some bad IPv6 implementation
			channel.socket().bind(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
			}
		}
	}

}