// 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 ; }