1 16 17 package socket; 18 19 import java.io.EOFException ; 20 import java.io.FileInputStream ; 21 import java.io.FilterInputStream ; 22 import java.io.InputStream ; 23 import java.io.IOException ; 24 import java.io.OutputStream ; 25 import java.net.ServerSocket ; 26 import java.net.Socket ; 27 import java.util.Random ; 28 29 import socket.io.WrappedInputStream; 30 import socket.io.WrappedOutputStream; 31 32 import org.apache.xerces.parsers.SAXParser; 33 34 import org.xml.sax.AttributeList ; 35 import org.xml.sax.DocumentHandler ; 36 import org.xml.sax.HandlerBase ; 37 import org.xml.sax.InputSource ; 38 import org.xml.sax.Parser ; 39 import org.xml.sax.SAXException ; 40 import org.xml.sax.SAXParseException ; 41 42 93 public class KeepSocketOpen { 94 95 99 100 public static void main(String [] argv) throws Exception { 101 102 final int port = 6789; 104 105 if (argv.length == 0) { 107 System.out.println("usage: java socket.KeepSocketOpen file(s)"); 108 System.exit(1); 109 } 110 111 Server server = new Server(port, argv); 113 Client client = new Client("localhost", port); 114 115 new Thread (server).start(); 117 new Thread (client).start(); 118 119 } 121 125 130 public static final class Server 131 extends ServerSocket 132 implements Runnable { 133 134 138 139 private String [] fFilenames; 140 141 142 private boolean fVerbose; 143 144 145 private byte[] fBuffer; 146 147 151 155 public Server(int port, String [] filenames) throws IOException { 156 this(port, filenames, false); 157 } 158 159 163 public Server(int port, String [] filenames, boolean verbose) 164 throws IOException { 165 super(port); 166 System.out.println("Server: Created."); 167 fFilenames = filenames; 168 fVerbose = verbose; 169 fBuffer = new byte[4096<<2]; 171 } 173 177 178 public void run() { 179 180 System.out.println("Server: Running."); 181 final Random random = new Random (System.currentTimeMillis()); 182 try { 183 184 if (fVerbose) System.out.println("Server: Waiting for Client connection..."); 186 final Socket clientSocket = accept(); 187 final OutputStream clientStream = clientSocket.getOutputStream(); 188 System.out.println("Server: Client connected."); 189 190 for (int i = 0; i < fFilenames.length; i++) { 192 193 String filename = fFilenames[i]; 195 System.out.println("Server: Opening file \""+filename+'"'); 196 FileInputStream fileIn = new FileInputStream (filename); 197 198 if (fVerbose) System.out.println("Server: Wrapping output stream."); 200 WrappedOutputStream wrappedOut = new WrappedOutputStream(clientStream); 201 202 int total = 0; 204 while (true) { 205 206 int length = fBuffer.length; 209 if (fVerbose) System.out.println("Server: Attempting to read "+length+" byte(s)."); 210 int count = fileIn.read(fBuffer, 0, length); 211 if (count == -1) { 212 if (fVerbose) System.out.println("Server: EOF."); 213 break; 214 } 215 if (fVerbose) System.out.println("Server: Writing "+count+" byte(s) to wrapped output stream."); 216 wrappedOut.write(fBuffer, 0, count); 217 total += count; 218 } 219 System.out.println("Server: Wrote "+total+" byte(s) total."); 220 221 if (fVerbose) System.out.println("Server: Closing output stream."); 223 wrappedOut.close(); 224 225 if (fVerbose) System.out.println("Server: Closing file."); 227 fileIn.close(); 228 } 229 230 if (fVerbose) System.out.println("Server: Closing socket."); 232 clientSocket.close(); 233 234 } 235 catch (IOException e) { 236 System.out.println("Server ERROR: "+e.getMessage()); 237 } 238 System.out.println("Server: Exiting."); 239 240 } 242 } 244 249 public static final class Client 250 extends HandlerBase 251 implements Runnable { 252 253 257 258 private Socket fServerSocket; 259 260 261 private WrappedInputStream fWrappedInputStream; 262 263 264 private boolean fVerbose; 265 266 267 private byte[] fBuffer; 268 269 270 private SAXParser fParser; 271 272 274 275 private int fElementCount; 276 277 278 private int fAttributeCount; 279 280 281 private int fIgnorableWhitespaceCount; 282 283 284 private int fCharactersCount; 285 286 287 private long fTimeBefore; 288 289 293 297 public Client(String address, int port) throws IOException { 298 this(address, port, false); 299 fParser = new SAXParser(); 300 fParser.setDocumentHandler(this); 301 fParser.setErrorHandler(this); 302 } 303 304 308 public Client(String address, int port, boolean verbose) 309 throws IOException { 310 System.out.println("Client: Created."); 311 fServerSocket = new Socket (address, port); 312 fVerbose = verbose; 313 fBuffer = new byte[1024]; 314 } 316 320 321 public void run() { 322 323 System.out.println("Client: Running."); 324 try { 325 final InputStream serverStream = fServerSocket.getInputStream(); 327 328 while (!Thread.interrupted()) { 330 if (fVerbose) System.out.println("Client: Wrapping input stream."); 332 fWrappedInputStream = new WrappedInputStream(serverStream); 333 InputStream in = new InputStreamReporter(fWrappedInputStream); 334 335 if (fVerbose) System.out.println("Client: Parsing XML document."); 337 InputSource source = new InputSource (in); 338 fParser.parse(source); 339 fWrappedInputStream = null; 340 341 if (fVerbose) System.out.println("Client: Closing input stream."); 343 in.close(); 344 345 } 346 347 if (fVerbose) System.out.println("Client: Closing socket."); 349 fServerSocket.close(); 350 351 } 352 catch (EOFException e) { 353 } 355 catch (Exception e) { 356 System.out.println("Client ERROR: "+e.getMessage()); 357 } 358 System.out.println("Client: Exiting."); 359 360 } 362 366 367 public void startDocument() { 368 fElementCount = 0; 369 fAttributeCount = 0; 370 fIgnorableWhitespaceCount = 0; 371 fCharactersCount = 0; 372 fTimeBefore = System.currentTimeMillis(); 373 } 375 376 public void startElement(String name, AttributeList attrs) { 377 fElementCount++; 378 fAttributeCount += attrs != null ? attrs.getLength() : 0; 379 } 381 382 public void ignorableWhitespace(char[] ch, int offset, int length) { 383 fIgnorableWhitespaceCount += length; 384 } 386 387 public void characters(char[] ch, int offset, int length) { 388 fCharactersCount += length; 389 } 391 392 public void endDocument() { 393 long timeAfter = System.currentTimeMillis(); 394 System.out.print("Client: "); 395 System.out.print(timeAfter - fTimeBefore); 396 System.out.print(" ms ("); 397 System.out.print(fElementCount); 398 System.out.print(" elems, "); 399 System.out.print(fAttributeCount); 400 System.out.print(" attrs, "); 401 System.out.print(fIgnorableWhitespaceCount); 402 System.out.print(" spaces, "); 403 System.out.print(fCharactersCount); 404 System.out.print(" chars)"); 405 System.out.println(); 406 } 408 412 413 public void warning(SAXParseException e) throws SAXException { 414 System.out.println("Client: [warning] "+e.getMessage()); 415 } 417 418 public void error(SAXParseException e) throws SAXException { 419 System.out.println("Client: [error] "+e.getMessage()); 420 } 422 423 public void fatalError(SAXParseException e) throws SAXException { 424 System.out.println("Client: [fatal error] "+e.getMessage()); 425 try { 427 fWrappedInputStream.close(); 428 } 429 catch (IOException ioe) { 430 } 432 throw e; 433 } 435 439 445 class InputStreamReporter 446 extends FilterInputStream { 447 448 452 453 private long fTotal; 454 455 459 460 public InputStreamReporter(InputStream stream) { 461 super(stream); 462 } 464 468 469 public int read() throws IOException { 470 int b = super.in.read(); 471 if (b == -1) { 472 System.out.println("Client: Read "+fTotal+" byte(s) total."); 473 return -1; 474 } 475 fTotal++; 476 return b; 477 } 479 480 public int read(byte[] b, int offset, int length) 481 throws IOException { 482 int count = super.in.read(b, offset, length); 483 if (count == -1) { 484 System.out.println("Client: Read "+fTotal+" byte(s) total."); 485 return -1; 486 } 487 fTotal += count; 488 if (Client.this.fVerbose) System.out.println("Client: Actually read "+count+" byte(s)."); 489 return count; 490 } 492 } 494 } 496 } | Popular Tags |