Mercurial > hg > Members > kono > WifiBroadcast
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; } }