annotate src/wifibroadcast/WifiMulticastChannel.java @ 19:bb2538b7eb8d

selectMode flag
author one
date Tue, 31 Jul 2012 17:02:46 +0900
parents e9d07562b6b7
children 313dc81af36c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9c99e2193277 find broadcast
one
parents: 2
diff changeset
12 import java.nio.channels.SelectionKey;
9c99e2193277 find broadcast
one
parents: 2
diff changeset
13 import java.nio.channels.Selector;
9c99e2193277 find broadcast
one
parents: 2
diff changeset
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
2a328333ba70 no compile errors
one
parents: 1
diff changeset
16 public class WifiMulticastChannel implements WifiReceiver {
12
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
17 protected InetAddress mAddr;
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
18 protected DatagramChannel dc;
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
19 protected SocketAddress sAddr;
11
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
20 // select on DatagramChannel does not work now
12
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
21 protected Selector selector;
19
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
22 protected boolean selectMode = false;
12
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
23
e1f43b669cdb broadcast on DatagramChannel
one
parents: 11
diff changeset
24 public WifiMulticastChannel() {}
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
25
18
e9d07562b6b7 network interface
one
parents: 17
diff changeset
26 public WifiMulticastChannel(int id, String mCASTADDR, int port,String nis, SocketType sender) throws IOException {
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
27 // join multicast group on this interface, and also use this
9c99e2193277 find broadcast
one
parents: 2
diff changeset
28 // interface for outgoing multicast datagrams
14
one
parents: 12
diff changeset
29 selector = SelectorProvider.provider().openSelector();
18
e9d07562b6b7 network interface
one
parents: 17
diff changeset
30 NetworkInterface ni = NetworkInterface.getByName(nis);
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
31 if (ni==null) {
18
e9d07562b6b7 network interface
one
parents: 17
diff changeset
32 System.err.println("Can't open network interface "+nis);
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
33 throw new IOException();
9c99e2193277 find broadcast
one
parents: 2
diff changeset
34 }
0
df9d16620c08 Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
36 if (!ni.supportsMulticast()) {
18
e9d07562b6b7 network interface
one
parents: 17
diff changeset
37 System.err.println("Network interface does not support multicast"+nis);
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
38 throw new IOException();
9c99e2193277 find broadcast
one
parents: 2
diff changeset
39 }
0
df9d16620c08 Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
15
cce76e5eb29b with tcp
one
parents: 14
diff changeset
41 // dc = SelectorProvider.provider().openDatagramChannel(StandardProtocolFamily.INET);
cce76e5eb29b with tcp
one
parents: 14
diff changeset
42 dc = DatagramChannel.open(StandardProtocolFamily.INET);
14
one
parents: 12
diff changeset
43 dc.setOption(StandardSocketOptions.SO_REUSEADDR, true);
one
parents: 12
diff changeset
44 dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
45 mAddr = InetAddress.getByName(mCASTADDR);
11
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
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
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
48
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
49 if (sender == SocketType.Receiver) {
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
50 dc.bind(new InetSocketAddress(port));
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
51 if (selectMode) {
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
52 dc.configureBlocking(false);
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
53 dc.register(selector, SelectionKey.OP_READ);
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
54 }
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
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
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
60 if (selectMode && selector.select(timeout)==0) {
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
61 System.out.println("bad select "+timeout);
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
62 testData.limit(0); testData.position(0);
11
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
63 return;
3
9c99e2193277 find broadcast
one
parents: 2
diff changeset
64 }
11
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
65 SocketAddress s = dc.receive(testData);
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
66 testData.flip();
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
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
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
72 while(testData.hasRemaining()) {
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
73 dc.send(testData, sAddr);
7912fd3af027 non select mode on DatagramChannel.
one
parents: 9
diff changeset
74 }
17
3d71ca942a48 minor change
one
parents: 15
diff changeset
75 // try {
3d71ca942a48 minor change
one
parents: 15
diff changeset
76 // Thread.sleep(100);
3d71ca942a48 minor change
one
parents: 15
diff changeset
77 // } catch (InterruptedException e) {
3d71ca942a48 minor change
one
parents: 15
diff changeset
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
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
81 @Override
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
82 public void selectMode(boolean mode) {
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
83 selectMode = mode;
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
84 }
bb2538b7eb8d selectMode flag
one
parents: 18
diff changeset
85
0
df9d16620c08 Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 }