001: /*
002: * Copyright (c) 2001 Silvere Martin-Michiellot All Rights Reserved.
003: *
004: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
005: * royalty free, license to use, modify and redistribute this
006: * software in source and binary code form,
007: * provided that i) this copyright notice and license appear on all copies of
008: * the software; and ii) Licensee does not utilize the software in a manner
009: * which is disparaging to Silvere Martin-Michiellot.
010: *
011: * This software is provided "AS IS," without a warranty of any kind. ALL
012: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
013: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
014: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
015: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
016: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
017: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
018: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
019: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
020: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
021: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
022: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
023: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
024: *
025: * This software is not designed or intended for use in on-line control of
026: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
027: * the design, construction, operation or maintenance of any nuclear
028: * facility. Licensee represents and warrants that it will not use or
029: * redistribute the Software for such purposes.
030: *
031: * @Author: Silvere Martin-Michiellot
032: *
033: */
034:
035: package com.db.client;
036:
037: /**
038: * This class provides methods to help the search for a server. It uses a socket to connect to some well known UniverseServerHelper without authentification to get some information on Gates and WorldSpots.
039: */
040:
041: import java.io.*;
042: import java.net.*;
043: import java.util.HashSet;
044:
045: import com.db.net.*;
046: import com.db.server.Gate;
047:
048: public class ServerHelper {
049:
050: private InetAddress localIP;
051: private int localPort;
052:
053: public ServerHelper(InetAddress localIP, int localPort) {
054:
055: this .localIP = localIP;
056: this .localPort = localPort;
057:
058: }
059:
060: //uses a predefined INetAddress to get access to a list of Virtual Worlds
061: public final Gate getWellKnownServer() {
062:
063: Gate gate;
064: final InetAddress inetAddress;
065: final int port;
066:
067: // WARNING there should be the definitive hardcoded address of the Digital Biosphere main server (only a relay in fact)
068: try {
069:
070: inetAddress = InetAddress.getByName("129.192.0.0");
071:
072: port = 1417;
073: gate = new Gate(inetAddress, port);
074:
075: } catch (UnknownHostException unknownHostException) {
076:
077: gate = null;
078:
079: }
080:
081: return gate;
082:
083: }
084:
085: //using a UniverseServer and querying its gates
086: //returns null or throws an IO error if this is not a UniverseServer address
087: //use this.getWellKnownServer() as argument to get a big starting list
088: //returns a HashSet of Gates
089: public HashSet getGates(Gate gate) {
090:
091: HashSet hashSet;
092:
093: Socket socket;
094: ObjectOutputStream objectOutputStream;
095: ObjectInputStream objectInputStream;
096:
097: ControlRequest controlRequest;
098: ControlReply controlReply;
099:
100: try {
101:
102: socket = new Socket(gate.getIP(), gate.getPort(),
103: this .localIP, this .localPort);
104:
105: objectInputStream = new ObjectInputStream(socket
106: .getInputStream());
107: objectOutputStream = new ObjectOutputStream(socket
108: .getOutputStream());
109:
110: controlRequest = new ControlRequest(ControlRequest.GATES);
111: // send request
112: objectOutputStream.writeObject(controlRequest);
113:
114: // read response
115: try {
116:
117: controlReply = (ControlReply) objectInputStream
118: .readObject();
119:
120: if (controlReply.getReplyKind() != ControlReply.REFUSED) {
121:
122: //build the string
123: hashSet = (HashSet) controlReply.getObjectValue();
124:
125: } else {
126:
127: hashSet = new HashSet();
128:
129: }
130:
131: } catch (ClassNotFoundException classNotFoundException) {
132:
133: hashSet = new HashSet();
134:
135: }
136:
137: objectOutputStream.flush();
138: objectInputStream.close();
139: objectOutputStream.close();
140:
141: socket.close();
142:
143: }
144:
145: catch (IOException iOException) {
146:
147: hashSet = new HashSet();
148:
149: }
150:
151: return hashSet;
152:
153: }
154:
155: public boolean isMulticastServer(Gate gate) {
156:
157: return gate.getIP().isMulticastAddress();
158:
159: }
160:
161: //using a UniverseServer and querying its local and remote world spots
162: //local and remote servers are queried together since
163: //returns null or throws an IO error if this is not a UniverseServer address
164: //returns a HashSet of WorldSpotBasicInformation
165: public HashSet getWorldSpots(Gate gate) {
166:
167: HashSet hashSet1;
168: HashSet hashSet2;
169:
170: Socket socket;
171: ObjectOutputStream objectOutputStream;
172: ObjectInputStream objectInputStream;
173:
174: ControlRequest controlRequest1;
175: ControlRequest controlRequest2;
176: ControlReply controlReply1;
177: ControlReply controlReply2;
178:
179: try {
180:
181: socket = new Socket(gate.getIP(), gate.getPort(),
182: this .localIP, this .localPort);
183:
184: objectInputStream = new ObjectInputStream(socket
185: .getInputStream());
186: objectOutputStream = new ObjectOutputStream(socket
187: .getOutputStream());
188:
189: controlRequest1 = new ControlRequest(
190: ControlRequest.LOCALWORLDSPOTS);
191: controlRequest2 = new ControlRequest(
192: ControlRequest.REMOTEWORLDSPOTS);
193: // send request
194: objectOutputStream.writeObject(controlRequest1);
195: objectOutputStream.writeObject(controlRequest2);
196: // read response
197: try {
198:
199: controlReply1 = (ControlReply) objectInputStream
200: .readObject();
201: controlReply2 = (ControlReply) objectInputStream
202: .readObject();
203:
204: if ((controlReply1.getReplyKind() != ControlReply.REFUSED)
205: || (controlReply2.getReplyKind() != ControlReply.REFUSED)) {
206:
207: //build the string
208: hashSet1 = (HashSet) controlReply1.getObjectValue();
209: hashSet2 = (HashSet) controlReply2.getObjectValue();
210:
211: hashSet1.addAll(hashSet2);
212:
213: } else {
214:
215: hashSet1 = new HashSet();
216:
217: }
218:
219: } catch (ClassNotFoundException classNotFoundException) {
220:
221: hashSet1 = new HashSet();
222:
223: }
224:
225: objectOutputStream.flush();
226: objectInputStream.close();
227: objectOutputStream.close();
228:
229: socket.close();
230:
231: }
232:
233: catch (IOException iOException) {
234:
235: hashSet1 = new HashSet();
236:
237: }
238:
239: return hashSet1;
240:
241: }
242:
243: }
|