Mercurial > hg > Members > kono > WifiBroadcast
annotate src/wifibroadcast/WifiMulticastChannel.java @ 19:bb2538b7eb8d
selectMode flag
author | one |
---|---|
date | Tue, 31 Jul 2012 17:02:46 +0900 |
parents | e9d07562b6b7 |
children | 313dc81af36c |
rev | line source |
---|---|
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 package wifibroadcast; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 import java.io.IOException; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 import java.net.InetAddress; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 import java.net.InetSocketAddress; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 import java.net.NetworkInterface; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 import java.net.SocketAddress; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 import java.net.StandardProtocolFamily; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 import java.net.StandardSocketOptions; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 import java.nio.ByteBuffer; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 import java.nio.channels.DatagramChannel; |
3 | 12 import java.nio.channels.SelectionKey; |
13 import java.nio.channels.Selector; | |
14 import java.nio.channels.spi.SelectorProvider; | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
2 | 16 public class WifiMulticastChannel implements WifiReceiver { |
12 | 17 protected InetAddress mAddr; |
18 protected DatagramChannel dc; | |
19 protected SocketAddress sAddr; | |
11 | 20 // select on DatagramChannel does not work now |
12 | 21 protected Selector selector; |
19 | 22 protected boolean selectMode = false; |
12 | 23 |
24 public WifiMulticastChannel() {} | |
3 | 25 |
18 | 26 public WifiMulticastChannel(int id, String mCASTADDR, int port,String nis, SocketType sender) throws IOException { |
3 | 27 // join multicast group on this interface, and also use this |
28 // interface for outgoing multicast datagrams | |
14 | 29 selector = SelectorProvider.provider().openSelector(); |
18 | 30 NetworkInterface ni = NetworkInterface.getByName(nis); |
3 | 31 if (ni==null) { |
18 | 32 System.err.println("Can't open network interface "+nis); |
3 | 33 throw new IOException(); |
34 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 |
3 | 36 if (!ni.supportsMulticast()) { |
18 | 37 System.err.println("Network interface does not support multicast"+nis); |
3 | 38 throw new IOException(); |
39 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 |
15 | 41 // dc = SelectorProvider.provider().openDatagramChannel(StandardProtocolFamily.INET); |
42 dc = DatagramChannel.open(StandardProtocolFamily.INET); | |
14 | 43 dc.setOption(StandardSocketOptions.SO_REUSEADDR, true); |
44 dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni); | |
3 | 45 mAddr = InetAddress.getByName(mCASTADDR); |
11 | 46 sAddr = new InetSocketAddress(mAddr,port); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 dc.join(mAddr, ni); |
11 | 48 |
49 if (sender == SocketType.Receiver) { | |
50 dc.bind(new InetSocketAddress(port)); | |
51 if (selectMode) { | |
52 dc.configureBlocking(false); | |
53 dc.register(selector, SelectionKey.OP_READ); | |
54 } | |
55 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 public void recieve(ByteBuffer testData, long timeout) throws IOException { |
11 | 60 if (selectMode && selector.select(timeout)==0) { |
61 System.out.println("bad select "+timeout); | |
3 | 62 testData.limit(0); testData.position(0); |
11 | 63 return; |
3 | 64 } |
11 | 65 SocketAddress s = dc.receive(testData); |
66 testData.flip(); | |
67 System.out.println("From "+s+" "+testData.remaining()+" bytes."); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 public void send(ByteBuffer testData) throws IOException { |
11 | 72 while(testData.hasRemaining()) { |
73 dc.send(testData, sAddr); | |
74 } | |
17 | 75 // try { |
76 // Thread.sleep(100); | |
77 // } catch (InterruptedException e) { | |
78 // } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 |
19 | 81 @Override |
82 public void selectMode(boolean mode) { | |
83 selectMode = mode; | |
84 } | |
85 | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 } |