changeset 14:7b43c3c60708

tcp
author one
date Mon, 30 Jul 2012 14:04:22 +0900
parents 9bf4bf393e4e
children cce76e5eb29b
files src/wifibroadcast/WifiBroadcastChannel.java src/wifibroadcast/WifiBroadcastTest.java src/wifibroadcast/WifiMulticastChannel.java src/wifibroadcast/WifiTCP.java
diffstat 4 files changed, 83 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/wifibroadcast/WifiBroadcastChannel.java	Sun Jul 29 15:55:03 2012 +0900
+++ b/src/wifibroadcast/WifiBroadcastChannel.java	Mon Jul 30 14:04:22 2012 +0900
@@ -4,7 +4,6 @@
 import java.net.InetSocketAddress;
 import java.net.StandardProtocolFamily;
 import java.net.StandardSocketOptions;
-import java.nio.channels.DatagramChannel;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.spi.SelectorProvider;
 
@@ -14,10 +13,9 @@
 		// join multicast group on this interface, and also use this
 		// interface for outgoing multicast datagrams
 		selectMode = false;
-		selector = SelectorProvider.provider().openSelector();	
-
-		dc = DatagramChannel.open(StandardProtocolFamily.INET)
-				.setOption(StandardSocketOptions.SO_REUSEADDR, true);
+		selector = SelectorProvider.provider().openSelector();    
+		dc = SelectorProvider.provider().openDatagramChannel(StandardProtocolFamily.INET);
+		dc.setOption(StandardSocketOptions.SO_REUSEADDR, true);
 		mAddr = WifiBroadcast.getBroadcast();
 		sAddr = new InetSocketAddress(mAddr,port);
 		dc.setOption(StandardSocketOptions.SO_BROADCAST, true);
--- a/src/wifibroadcast/WifiBroadcastTest.java	Sun Jul 29 15:55:03 2012 +0900
+++ b/src/wifibroadcast/WifiBroadcastTest.java	Mon Jul 30 14:04:22 2012 +0900
@@ -82,6 +82,7 @@
            "-h          print this\n"+
            ""
          );
+         return;
       }
 		}
 	}
--- a/src/wifibroadcast/WifiMulticastChannel.java	Sun Jul 29 15:55:03 2012 +0900
+++ b/src/wifibroadcast/WifiMulticastChannel.java	Mon Jul 30 14:04:22 2012 +0900
@@ -26,7 +26,7 @@
 	public WifiMulticastChannel(int id, String mCASTADDR, int port, SocketType sender) throws IOException {
 		// join multicast group on this interface, and also use this
 		// interface for outgoing multicast datagrams
-		selector = SelectorProvider.provider().openSelector();	
+		selector = SelectorProvider.provider().openSelector();    
 		NetworkInterface ni = NetworkInterface.getByName("en1");
 		if (ni==null) {
 			System.err.println("Can't open network interface "+"en1");
@@ -38,9 +38,9 @@
 			throw new IOException();
 		}
 
-		dc = DatagramChannel.open(StandardProtocolFamily.INET)
-				.setOption(StandardSocketOptions.SO_REUSEADDR, true)
-				.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
+		dc = SelectorProvider.provider().openDatagramChannel(StandardProtocolFamily.INET);
+		dc.setOption(StandardSocketOptions.SO_REUSEADDR, true);
+		dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
 		mAddr = InetAddress.getByName(mCASTADDR);
 		sAddr = new InetSocketAddress(mAddr,port);
 		dc.join(mAddr, ni);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/wifibroadcast/WifiTCP.java	Mon Jul 30 14:04:22 2012 +0900
@@ -0,0 +1,75 @@
+package wifibroadcast;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.NetworkInterface;
+import java.net.SocketAddress;
+import java.net.StandardProtocolFamily;
+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.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.bind(new InetSocketAddress(port));
+			sc = ss.accept();
+			if (selectMode) {
+				sc.configureBlocking(false);
+				sc.register(selector, SelectionKey.OP_READ);
+			}
+		} else {
+            sc = SelectorProvider.provider().openSocketChannel();
+            sc.connect(sAddr);
+		}
+	}
+
+	@Override
+	public void recieve(ByteBuffer testData, long timeout) throws IOException {
+		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) {
+//		}
+	}
+
+}