annotate rep/channel/NetworkSimulator.java @ 203:4c0a94836357 simullator-nio-both-worked

*** empty log message ***
author kono
date Sat, 30 Aug 2008 11:21:43 +0900
parents 723187e39311
children e72e0eae1261
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
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
3 import java.net.SocketAddress;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
4 import java.util.HashMap;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
5 import java.util.LinkedList;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
6
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);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
36 printAllState();
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 /* */
203
4c0a94836357 *** empty log message ***
kono
parents: 177
diff changeset
40 synchronized public void listen(SocketAddress ip, SelectorSimulator<P> selector) {
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
41 serverList.add(new ServerData<P>(ip, selector));
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
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
46 synchronized public ChannelSimulator<P> accept(SocketAddress ip) {
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
47 for (ServerData<P> sd: serverList){
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
48 if (!sd.IP.equals(ip)) continue;
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
49 logger.writeLog("accepting..", 1);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
50
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
51 ChannelSimulator<P> serverCH = sd.acceptWaitingList.remove();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
52 sd.establishedList.add(serverCH);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
53
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
54 logger.writeLog("accepted", 1);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
55 printAllState();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
56 return serverCH;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
57 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
58 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
59 }
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
60 synchronized public boolean canAccept(SocketAddress ip){
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
61 for (ServerData<P> sd: serverList){
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
62 if (!sd.IP.equals(ip)) continue;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
63 return !sd.acceptWaitingList.isEmpty();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
64 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
65 return false;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
66 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
67
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
68 public boolean connect(SocketAddress ip, ChannelSimulator<P> clientCH) {
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
69 ServerData<P> sd = null;
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
70 logger.writeLog("connecting..", 1);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
71 synchronized (this){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
72 for (ServerData<P> sd0: serverList){
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
73 if (sd0.IP.equals(ip)){
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
74 sd=sd0;
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
75 break;
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
76 }
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
77 }
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
78 if (sd==null) return false;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
79
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
80 //ChannelSimulator<P> channel = new ChannelSimulator<P>(sd.selector);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
81 clientCH.createReadQ();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
82 clientCH.createWriteQ();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
83 clientCH.setWriteSelector(sd.selector);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
84
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
85 ChannelSimulator<P> serverCH = clientCH.createConjugatedChannel();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
86 sd.acceptWaitingList.add(serverCH);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
87 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
88
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
89 synchronized (sd.selector) {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
90 sd.selector.notifyAll();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
91 }
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
92 logger.writeLog("connected", 1);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
93 printAllState();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
94 return true;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
95 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
96
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
97 /** for DEBUG methods. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
98 synchronized void printAllState(){
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
99 logger.writeLog("NetworkSimulator State:");
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
100 for (ServerData<P> sd: serverList){
177
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
101 logger.writeLog("\tSessionManager(ip="+sd.IP.toString()+"): ");
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
102 logger.writeLog("\tacceptWaitingList="+sd.acceptWaitingList.size());
723187e39311 *** empty log message ***
kent
parents: 175
diff changeset
103 logger.writeLog("\testablishedList="+sd.establishedList.size());
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
104 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
105 }
156
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
106
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
107
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
108
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
109 public int nslookup(SocketAddress semaIP) {
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
110 Integer ip;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
111 if ((ip=namedb.get(semaIP))==null) {
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
112 namedb.put(semaIP, (ip=ipcount++));
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
113 }
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
114 return ip;
31334767e65d *** empty log message ***
kono
parents: 151
diff changeset
115 }
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
116
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
117
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
118 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
119
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
120 class ServerData<P> {
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
121 //int virtualIP;
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
122 SocketAddress IP;
203
4c0a94836357 *** empty log message ***
kono
parents: 177
diff changeset
123 SelectorSimulator<P> selector;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
124 LinkedList<ChannelSimulator<P>> acceptWaitingList;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
125 LinkedList<ChannelSimulator<P>> establishedList;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
126
203
4c0a94836357 *** empty log message ***
kono
parents: 177
diff changeset
127 ServerData(SocketAddress ip, SelectorSimulator<P> _selector){
175
5653cf8e3c8b *** empty log message ***
kent
parents: 174
diff changeset
128 IP = ip;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
129 selector = _selector;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
130 acceptWaitingList = new LinkedList<ChannelSimulator<P>>();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
131 establishedList = new LinkedList<ChannelSimulator<P>>();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
132 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
133 }