1 // Purpose. Server base class 2 // Source. Scott Oaks, Java Report, Oct 98, pp86-88 3 import java.io.*; 4 import java.net.*; 5 class ServerBaseClass implements Runnable, Cloneable { 6 private Thread runner = null; 7 private ServerSocket server = null; 8 private Socket data = null; 9 private boolean shouldStop = false; 10 public synchronized void startServer( int port ) { 11 System.out.println("startServer: entry"); 12 if (runner == null) { 13 try { 14 server = new ServerSocket( port ); 15 } catch( Exception e ) { e.printStackTrace(); } 16 runner = new Thread( this ); 17 System.out.println( "startServer: before runner.start()" ); 18 runner.start(); 19 } } 20 public synchronized void stopServer() { 21 if (server != null) { 22 shouldStop = true; 23 runner.interrupt(); 24 runner = null; 25 try { server.close(); } catch( Exception e ) { e.printStackTrace(); } 26 server = null; 27 } } 28 public void run() { 29 System.out.println( "ServerBaseClass.run(): entry" ); 30 if (server != null) 31 while ( ! shouldStop) 32 try { 33 Socket dataSocket = server.accept(); 34 ServerBaseClass newSocket = (ServerBaseClass) clone(); 35 newSocket.server = null; 36 newSocket.data = dataSocket; 37 newSocket.runner = new Thread( newSocket ); 38 System.out.println( " before newSocket.runner.start()" ); 39 newSocket.runner.start(); 40 } catch( Exception e ) { e.printStackTrace(); } 41 else 42 run( data ); 43 } 44 public void run( Socket data ) { 45 } 46 }