view src/wifibroadcast/WifiTCP.java @ 21:48d458bb921a

no select
author one
date Tue, 31 Jul 2012 17:31:08 +0900
parents bb2538b7eb8d
children
line wrap: on
line source

package wifibroadcast;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.spi.SelectorProvider;

public class WifiTCP implements WifiReceiver {
	protected InetAddress mAddr;
	protected SocketAddress sAddr;
	// select on DatagramChannel does not work now
	protected static Selector selector;
	protected boolean selectMode = false;
    private SocketChannel sc; 
    private static ServerSocketChannel ss;
	
    static {
        try {
            ss = SelectorProvider.provider().openServerSocketChannel();
            selector = SelectorProvider.provider().openSelector();    
        } catch (IOException e) {
        }
    }
	public WifiTCP() {}

	public WifiTCP(int id, String mCASTADDR, int port, SocketType sender) throws IOException {
		mAddr = InetAddress.getByName(mCASTADDR);
		sAddr = new InetSocketAddress(mAddr,port);
		if (sender == SocketType.Receiver) {
		    ss.setOption(StandardSocketOptions.SO_REUSEADDR, true);
			ss.bind(new InetSocketAddress(port));
		} else {
            sc = SelectorProvider.provider().openSocketChannel();
            sc.connect(sAddr);
		}
	}

	@Override
	public void recieve(ByteBuffer testData, long timeout) throws IOException {
	    if (sc==null) {
	        sc = ss.accept();
	        if (selectMode) {
	            sc.configureBlocking(false);
	            sc.register(selector, SelectionKey.OP_READ);
	        }
	    }
		if (selectMode && selector.select(timeout)==0) {
			System.out.println("bad select "+timeout);
			testData.limit(0); testData.position(0);
			return;
		}
		sc.read(testData);
		testData.flip();
		System.out.println("Read "+testData.remaining()+" bytes.");
	}

	@Override
	public void send(ByteBuffer testData) throws IOException {
		while(testData.hasRemaining()) {
			sc.write(testData);
		}
//		try {
//			Thread.sleep(100);
//		} catch (InterruptedException e) {
//		}
	}

    @Override
    public void selectMode(boolean mode) {
        selectMode = mode;
    }

}