// SpaceWarServer

// Burton Rosenberg
// Sat Jul 19 10:40:06 EDT 1997
// Sun Jul 20
// hold 2 spacecraft and respond to G w/ G.

package SpaceWar ;
import java.io.* ;
import java.net.* ;

public class SpaceWarServer {

   static final int PORT_NUMBER = 2234 ;

   public static void main ( String [] args ) {

      ServerSocket ss ;
      SpaceWarConnection [] swc = new SpaceWarConnection[2] ;
      DeathFlag [] df = new DeathFlag[2] ;
      for ( int i=0; i < swc.length; i++ ) {
         swc[i] = null ;
         df[i] = new DeathFlag() ;
      }

      try {
         ss = new ServerSocket( PORT_NUMBER ) ;
         Socket s ;
         int i ;
         while (true) {
            s = ss.accept() ;
            for ( i=0; i< swc.length; i++ ) 
               if ( swc[i] == null || df[i].flag ) break ;
            if ( i < swc.length ) {
               df[i].flag = false ;
               swc[i] = new SpaceWarConnection( s, df[i] ) ;
               swc[i].start() ;
            }
            else s.close() ;
            for ( i=0; i< swc.length; i++ ) 
               if ( swc[i] == null ) break ;
            if ( i == swc.length ) {
                swc[0].setAdversary( swc[1] ) ;
                swc[1].setAdversary( swc[0] ) ;
            }
         }
      }
      catch ( IOException ioe ) {
           System.out.println("Error: "+ ioe.getMessage() ) ;
      }        

   }

}

class SpaceWarConnection 
extends Thread {

    InputStream is ;
    OutputStream os ;
    DataInputStream dis ;
    PrintStream ps ;
    Socket s ;
    SpaceWarConnection adversary = null ;
    String theMessage = "+ OK" ;
    DeathFlag deathFlag ;

    SpaceWarConnection( Socket s, DeathFlag deathFlag ) {

      try {
         this.s = s ;
         this.deathFlag = deathFlag ;
         is = s.getInputStream() ;
         os = s.getOutputStream() ;
         dis = new DataInputStream( is ) ;
         ps = new PrintStream( os ) ;
      }
      catch ( IOException ioe ) { }
    }

    synchronized void setAdversary( SpaceWarConnection swc ) {
       adversary = swc ;
    }
    
    public void run() {
       String lineOfInput ;

       try { 
          while ( (lineOfInput = dis.readLine()) != null ) {

             putMessage(lineOfInput) ;

             if ( lineOfInput.charAt(0) == 'P' &&
                adversary != null )
                synchronized ( this ) {
                   ps.println(adversary.getMessage()) ;
                }
             else {
                ps.println("+ OK") ;
             }

          }

       }
       catch ( IOException ioe ) {
       }
       putMessage("+ OK") ;
       deathFlag.flag = true ;
    }

    synchronized String getMessage() { return theMessage ; }
    synchronized void putMessage(String m) { theMessage = m ; }
  
}

class DeathFlag {
   boolean flag = false ;
}
