home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / networkserver.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  161 lines

  1. /*
  2.  * @(#)NetworkServer.java    1.4 95/05/11 James Gosling
  3.  * 
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19. package net;
  20.  
  21. import net.*;
  22. import java.io.*;
  23.  
  24. /**
  25.  * This is the base class for network servers.  To define a new type
  26.  * of server define a new subclass of NetworkServer with a serviceRequest
  27.  * method that services one request.  Start the server by executing:
  28.  * <pre>
  29.  *    new MyServerClass().startServer(port);
  30.  * </pre>
  31.  */
  32. public class NetworkServer implements Runnable {
  33.  
  34.     /** Socket for communicating with client. */
  35.     public Socket clientSocket = null;
  36.     private Thread serverInstance;
  37.     private boolean isServer;
  38.  
  39.     /** Stream for printing to the client. */
  40.     public PrintStream clientOutput;
  41.  
  42.     /** Buffered stream for reading replies from client. */
  43.     public InputStream clientInput;
  44.  
  45.     /** Close an open connection to the client. */
  46.     public void close() {
  47.     try {
  48.         clientOutput.close();
  49.     } catch(Exception e) {
  50.     }
  51.     try {
  52.         clientInput.close();
  53.     } catch(Exception e) {
  54.     }
  55.     try {
  56.         clientSocket.close();
  57.     } catch(Exception e) {
  58.     }
  59.     clientSocket = null;
  60.     clientInput = null;
  61.     clientOutput = null;
  62.     }
  63.  
  64.     /** Return client connection status */
  65.     public boolean clientIsOpen() {
  66.     return clientSocket != null;
  67.     }
  68.  
  69.     final public void run() {
  70.     if (isServer) {
  71.         Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
  72.         // System.out.print("Server starts " + clientSocket + "\n");
  73.         while (true) {
  74.         try {
  75.             Socket ns = clientSocket.accept();
  76. //            System.out.print("New connection " + ns + "\n");
  77.             NetworkServer n = (NetworkServer) clone();
  78.             n.clientSocket = ns;
  79.             n.isServer = false;
  80.             new Thread(n).start();
  81.         } catch(Exception e) {
  82.             System.out.print("Server failure\n");
  83.             e.printStackTrace();
  84.             clientSocket.close();
  85. System.out.print("cs="+clientSocket.port+"\n");
  86. System.out.print("ia="+clientSocket.address+"\n");
  87.             Socket nns = new Socket(true);
  88.             nns.port = clientSocket.port;
  89.             nns.bindToPort(clientSocket.address,
  90.                    clientSocket.port);
  91.             clientSocket = nns;
  92.         }
  93.         }
  94. //        close();
  95.     } else {
  96.         try {
  97.         clientOutput = new PrintStream(
  98.             new BufferedOutputStream(clientSocket.outputStream),
  99.                            false);
  100.         clientInput = new BufferedInputStream(clientSocket.inputStream);
  101.         serviceRequest();
  102.         // System.out.print("Service handler exits
  103.         // "+clientSocket+"\n");
  104.         } catch(Exception e) {
  105.         // System.out.print("Service handler failure\n");
  106.         // e.printStackTrace();
  107.         }
  108.         close();
  109.     }
  110.     }
  111.  
  112.     /** Start a server on port <i>port</i>.  It will call serviceRequest()
  113.         for each new connection. */
  114.     final public void startServer(int port) {
  115.     Socket s = new Socket(true);
  116.     InetAddress addr = InetAddress.getByName(InetAddress.localHostName);
  117.     int i;
  118.     for (i = 10; --i >= 0;) {
  119.         try {
  120.         s.port = port;
  121.         s.bindToPort(addr, port);
  122.         break;
  123.         } catch(Exception e) {
  124.         System.out.print("[Waiting to create port]\n");
  125.         Thread.sleep(5000);
  126.         }
  127.     }
  128.     if (i < 0) {
  129.         System.out.print("**Failed to create port\n");
  130.         return;
  131.     }
  132.     s.listen(50);
  133.     serverInstance = new Thread(this);
  134.     isServer = true;
  135.     clientSocket = s;
  136.     serverInstance.start();
  137.     }
  138.  
  139.     /** Service one request.  It is invoked with the clientInput and
  140.     clientOutput streams initialized.  This method handles one client
  141.     connection. When it is done, it can simply exit. The default
  142.     server just echoes it's input. It is invoked in it's own private
  143.     thread. */
  144.     public void serviceRequest() {
  145.     byte buf[] = new byte[300];
  146.     int n;
  147.     clientOutput.print("Echo server " + getClass().getName() + "\n");
  148.     clientOutput.flush();
  149.     while ((n = clientInput.read(buf, 0, buf.length)) >= 0) {
  150.         clientOutput.write(buf, 0, n);
  151.     }
  152.     }
  153.  
  154.     public static void main(String argv[]) {
  155.     new NetworkServer ().startServer(8888);
  156.     }
  157.  
  158.     public NetworkServer () {
  159.     }
  160. }
  161.