view src/main/java/jp/ac/uryukyu/ie/kono/wifibroadcast/WifiTCP.java @ 27:12633f67f3cf default tip

jar
author oshiro
date Wed, 28 Nov 2018 18:28:39 +0900
parents src/main/jp/ac/uryukyu/ie/kono/wifibroadcast/WifiTCP.java@42ecbd9364fa
children
line wrap: on
line source

package jp.ac.uryukyu.ie.kono.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;
    }

}