annotate rep/channel/NetworkSimulator.java @ 308:c5be84d53c7f channel-simulator-update **INVALID**

*** empty log message ***
author kono
date Sat, 04 Oct 2008 22:12:34 +0900
parents 90965a3bd4f3
children edb373aa421e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
1 package rep.channel;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
2
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
3 import java.net.InetSocketAddress;
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
4 import java.net.SocketAddress;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
5 import java.util.HashMap;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
6 import java.util.LinkedList;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
7
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
8 public class NetworkSimulator<P> {
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
9 public static NetworkSimulator<?> ns;
151
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
10
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
11
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
12 public HashMap<SocketAddress,Integer>namedb = new HashMap<SocketAddress,Integer>();
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
13 public int ipcount = 1;
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
14 public REPLogger logger;
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
15
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
16 @SuppressWarnings("unchecked") // <?> から <T> へのキャストのため.
174
72252e970a8b *** empty log message ***
kent
parents: 156
diff changeset
17 public static <T> NetworkSimulator<T> singleton(){
151
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
18 // double check singleton
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
19 if (ns==null)
151
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
20 synchronized (NetworkSimulator.class) {
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
21 if (ns==null)
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
22 ns = new NetworkSimulator<T>();
4ae9da03cf1e *** empty log message ***
kono
parents: 143
diff changeset
23 }
174
72252e970a8b *** empty log message ***
kent
parents: 156
diff changeset
24 return (NetworkSimulator<T>) ns;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
25 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
26
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
27 int logLevel=5;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
28 /** Listening Servers. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
29 private LinkedList<ServerData<P>> serverList;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
30
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
31 /** Constructor. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
32 public NetworkSimulator(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
33 serverList = new LinkedList<ServerData<P>>();
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
34 logger = REPLogger.singleton();
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
35 logger.writeLog("construct Networksimulator", 1);
284
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
36 // printAllState();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
37 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
38
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
39 /* */
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
40 synchronized public void listen(InetSocketAddress ip, ServerChannelSimulator<P> scs) {
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
41 serverList.add(new ServerData<P>(ip, scs));
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
42 logger.writeLog("listen", 1);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
43 printAllState();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
44 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
45
284
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
46 synchronized public boolean connect(InetSocketAddress ip, ChannelSimulator<P> CHclient) {
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
47 logger.writeLog("connecting..", 1);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
48 for (ServerData<P> sd0: serverList){
281
c3969dd625b2 GUIless test routine.
kono
parents: 248
diff changeset
49 // ANY address (0.0.0.0/0.0.0.0) should be considered.
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
50 if (sd0.IP.getAddress().isAnyLocalAddress()) {
284
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
51 if (sd0.IP.getPort() != ip.getPort()) continue;
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
52 // we have to check, ip is really reachable to sd0 server,
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
53 // but this simulator has no notion of host. To distinguish,
90965a3bd4f3 editor simulator
kono
parents: 283
diff changeset
54 // use different port address.
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
55 } else if (!sd0.IP.equals(ip)) continue;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
56
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
57 ChannelSimulator<P> CHserver = new ChannelSimulator<P>();
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
58 CHserver.setOtherEnd(CHclient);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
59 CHclient.setOtherEnd(CHserver);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
60
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
61 sd0.connectedListS.add(CHserver);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
62 sd0.connectedListC.add(CHclient);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
63 sd0.scs.enQ(CHserver);
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
64
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
65 logger.writeLog("connected", 1);
308
c5be84d53c7f *** empty log message ***
kono
parents: 284
diff changeset
66 //printAllState();
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
67 return true;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
68 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
69 return false;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
70 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
71
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
72 /** for DEBUG methods. */
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
73 void printAllState(){
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
74 String log = "NetworkSimulator State:";
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
75 for (ServerData<P> sd: serverList){
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
76 log += "\tSessionManager(ip="+sd.IP.toString()+"): ";
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
77 log += channelList(sd.connectedListC);
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
78 }
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
79 logger.writeLog(log);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
80 }
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
81
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
82 String channelList(LinkedList<ChannelSimulator<P>> list){
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
83 String tmp = "";
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
84 for (ChannelSimulator<P> ch: list){
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
85 tmp += ch.toString()+" ";
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
86 }
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
87 return "\t"+tmp;
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
88 }
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
89
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
90
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
91
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
92 public int nslookup(SocketAddress semaIP) {
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
93 Integer ip;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
94 if ((ip=namedb.get(semaIP))==null) {
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
95 namedb.put(semaIP, (ip=ipcount++));
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
96 }
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
97 return ip;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
98 }
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
99
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
100
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
101 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
102
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
103 class ServerData<P> {
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
104 //int virtualIP;
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
105 InetSocketAddress IP;
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
106 //SelectorSimulator<P> selector;
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
107 ServerChannelSimulator<P> scs;
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
108 LinkedList<ChannelSimulator<P>> connectedListS;
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
109 LinkedList<ChannelSimulator<P>> connectedListC;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
110
282
c410eda661e8 *** empty log message ***
kono
parents: 281
diff changeset
111 ServerData(InetSocketAddress ip, ServerChannelSimulator<P> _scs){
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
112 IP = ip;
248
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
113 //selector = _selector;
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
114 scs = _scs;
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
115 connectedListS = new LinkedList<ChannelSimulator<P>>();
e72e0eae1261 *** empty log message ***
kent
parents: 203
diff changeset
116 connectedListC = new LinkedList<ChannelSimulator<P>>();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
117 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
118 }