Mercurial > hg > Members > kono > WifiBroadcast
annotate src/wifibroadcast/WifiMulticastChannel.java @ 12:e1f43b669cdb
broadcast on DatagramChannel
author | one |
---|---|
date | Sun, 29 Jul 2012 14:37:12 +0900 |
parents | 7912fd3af027 |
children | 7b43c3c60708 |
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; |
22 protected boolean selectMode = false; | |
23 | |
24 public WifiMulticastChannel() {} | |
3 | 25 |
9 | 26 public WifiMulticastChannel(int id, String mCASTADDR, int port, SocketType sender) throws IOException { |
3 | 27 // join multicast group on this interface, and also use this |
28 // interface for outgoing multicast datagrams | |
29 selector = SelectorProvider.provider().openSelector(); | |
30 NetworkInterface ni = NetworkInterface.getByName("en1"); | |
31 if (ni==null) { | |
32 System.err.println("Can't open network interface "+"en1"); | |
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()) { |
37 System.err.println("Network interface does not support multicast"+"en1"); | |
38 throw new IOException(); | |
39 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 |
3 | 41 dc = DatagramChannel.open(StandardProtocolFamily.INET) |
42 .setOption(StandardSocketOptions.SO_REUSEADDR, true) | |
43 .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni); | |
44 mAddr = InetAddress.getByName(mCASTADDR); | |
11 | 45 sAddr = new InetSocketAddress(mAddr,port); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 dc.join(mAddr, ni); |
11 | 47 |
48 if (sender == SocketType.Receiver) { | |
49 dc.bind(new InetSocketAddress(port)); | |
50 if (selectMode) { | |
51 dc.configureBlocking(false); | |
52 dc.register(selector, SelectionKey.OP_READ); | |
53 } | |
54 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 } |
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 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 public void recieve(ByteBuffer testData, long timeout) throws IOException { |
11 | 59 if (selectMode && selector.select(timeout)==0) { |
60 System.out.println("bad select "+timeout); | |
3 | 61 testData.limit(0); testData.position(0); |
11 | 62 return; |
3 | 63 } |
11 | 64 SocketAddress s = dc.receive(testData); |
65 testData.flip(); | |
66 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
|
67 } |
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 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 public void send(ByteBuffer testData) throws IOException { |
11 | 71 while(testData.hasRemaining()) { |
72 dc.send(testData, sAddr); | |
73 } | |
74 try { | |
75 Thread.sleep(100); | |
76 } catch (InterruptedException e) { | |
77 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 } |
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 } |