This server program includes several major changes from the basic server. First, it includes a rather substantial method,
buildUI
, to construct the user interface. Second, it includes anactionPerformed
method where button events are processed. Third, and most important, note the changes in the method that handles the connection and the I/O on it.import java.net.*; import java.io.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class Server_Second extends Frame implements ActionListener, WindowListener { //**************** single-threaded server, with UI //**************** default runs on jbspc.cs.unc.edu:8901 ServerSocket listenSocket; Socket connection; InputStream inStream; DataInputStream inDataStream; OutputStream outStream; DataOutputStream outDataStream; String message; TextField hostDisplay, portDisplay; TextArea logDisplay, msgDisplay; Panel topPanel; Panel middlePanel; Panel buttonPanel; Button listenButton, quitButton; public static final String DEFAULT_HOST = "jbspc.cs.unc.edu"; public static final int DEFAULT_PORT = 8901; String host; int port; public Server_Second ( String s) { super ( s ); buildUI (); } // end Server_Second constructor // ************** Primary Listen & Respond Method public void connectClient ( ) { if ( ! ( portDisplay.getText () ).equals ( "" ) ) port = Integer.parseInt ( portDisplay.getText () ); else port = DEFAULT_PORT; try { listenSocket = new ServerSocket ( port ); logDisplay.setText ( "Server running on "+host+", port "+port+"\n" ); connection = listenSocket.accept (); outStream = connection.getOutputStream (); outDataStream = new DataOutputStream ( outStream ); inStream = connection.getInputStream (); inDataStream = new DataInputStream ( inStream ); logDisplay.appendText ( "Connection request received\n" ); logDisplay.appendText ( "Message, below, received\n" ); try { message = inDataStream.readUTF (); msgDisplay.setForeground ( Color.red ); msgDisplay.appendText ( message ); } // end try for input catch ( EOFException except ) { logDisplay.appendText ( "message EOF received\n" ); } // end catch catch ( IOException except ) { System.out.println ( "IO Exception raised" ); except.printStackTrace (); } // end catch System.out.println ("Getting ready to return message"); message = msgDisplay.getText (); logDisplay.appendText ( "Message, below, returned to client \n" ); outDataStream.writeUTF ( message ); logDisplay.appendText ( "Connection closed\n" ); connection.close (); return; } // end try catch ( IOException except) { except.printStackTrace (); } // end catch } // end connectClient // ************** public static void main ( String [ ] args ) { Server_Second server = new Server_Second ( "Server_Second" ); server.addWindowListener ( server ); } // end main //*********** Utility Methods *********** // ************** public void buildUI () { try { InetAddress here = InetAddress.getLocalHost (); host = here.getHostName (); } catch (UnknownHostException e) { ;} hostDisplay = new TextField ( host, 30 ); portDisplay = new TextField ( Integer.toString ( DEFAULT_PORT ), 4 ); topPanel = new Panel (); topPanel.setLayout ( new GridLayout ( 2, 1 ) ); topPanel.add ( hostDisplay ); topPanel.add ( portDisplay ); logDisplay = new TextArea ( 40, 10 ); msgDisplay = new TextArea ( 40, 10 ); middlePanel = new Panel (); middlePanel.setLayout ( new GridLayout ( 2, 1 ) ); middlePanel.add ( logDisplay ); middlePanel.add ( msgDisplay ); listenButton = new Button ( "Listen" ); quitButton = new Button ( "Quit" ); listenButton.addActionListener ( this ); quitButton.addActionListener ( this ); buttonPanel = new Panel ( ); buttonPanel.add ( listenButton ); buttonPanel.add ( quitButton ); add ( "North", topPanel ); add ( "Center", middlePanel ); add ( "South", buttonPanel ); resize ( 400, 450 ); show (); } // end buildUI //*********** Interface Methods *********** //**** ActionListener methods public void actionPerformed ( ActionEvent e ) { Object s = e.getSource(); // *** process Button actions if ( s instanceof Button ) { if ( s == listenButton ) { connectClient (); } // end listenButton if ( s == quitButton ) { hide (); dispose (); System.exit ( 0 ); } // end quitButton } // end process Button actions } // end actionPerformed //**** WindowListener methods public void windowActivated ( WindowEvent e ) { } public void windowDeactivated ( WindowEvent e ) { } public void windowOpened ( WindowEvent e ) { } public void windowClosed ( WindowEvent e ) { } public void windowClosing ( WindowEvent e ) { hide (); dispose (); System.exit(0); } public void windowIconified ( WindowEvent e ) { } public void windowDeiconified ( WindowEvent e ) { } } // end Server_Second