Client.java
// Fig. 28.5: Client.java // Client portion of a stream-socket connection between client and server. import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Client extends JFrame { private JTextField enterField; // enters information from user private JTextArea displayArea; // display information to user private ObjectOutputStream output; // output stream to server private ObjectInputStream input; // input stream from server private String message = ""; // message from server private String chatServer; // host server for this application private Socket client; // socket to communicate with server // initialize chatServer and set up GUI public Client(String host) { super("Client"); chatServer = host; // set server to which this client connects enterField = new JTextField(); // create enterField enterField.setEditable(false); enterField.addActionListener( new ActionListener() { // send message to server public void actionPerformed(ActionEvent event) { sendData(event.getActionCommand()); enterField.setText(""); } } ); add(enterField, BorderLayout.NORTH); displayArea = new JTextArea(); // create displayArea add(new JScrollPane(displayArea), BorderLayout.CENTER); setSize(300, 150); // set size of window setVisible(true); // show window } // connect to server and process messages from server public void runClient() { try // connect to server, get streams, process connection { connectToServer(); // create a Socket to make connection getStreams(); // get the input and output streams processConnection(); // process connection } catch (EOFException eofException) { displayMessage("\nClient terminated connection"); } catch (IOException ioException) { ioException.printStackTrace(); } finally { closeConnection(); // close connection } } // connect to server private void connectToServer() throws IOException { displayMessage("Attempting connection\n"); // create Socket to make connection to server client = new Socket(InetAddress.getByName(chatServer), 12345); // display connection information displayMessage("Connected to: " + client.getInetAddress().getHostName()); } // get streams to send and receive data private void getStreams() throws IOException { // set up output stream for objects output = new ObjectOutputStream(client.getOutputStream()); output.flush(); // flush output buffer to send header information // set up input stream for objects input = new ObjectInputStream(client.getInputStream()); displayMessage("\nGot I/O streams\n"); } // process connection with server private void processConnection() throws IOException { // enable enterField so client user can send messages setTextFieldEditable(true); do // process messages sent from server { try // read message and display it { message = (String) input.readObject(); // read new message displayMessage("\n" + message); // display message } catch (ClassNotFoundException classNotFoundException) { displayMessage("\nUnknown object type received"); } } while (!message.equals("SERVER>>> TERMINATE")); } // close streams and socket private void closeConnection() { displayMessage("\nClosing connection"); setTextFieldEditable(false); // disable enterField try { output.close(); // close output stream input.close(); // close input stream client.close(); // close socket } catch (IOException ioException) { ioException.printStackTrace(); } } // send message to server private void sendData(String message) { try // send object to server { output.writeObject("CLIENT>>> " + message); output.flush(); // flush data to output displayMessage("\nCLIENT>>> " + message); } catch (IOException ioException) { displayArea.append("\nError writing object"); } } // manipulates displayArea in the event-dispatch thread private void displayMessage(final String messageToDisplay) { SwingUtilities.invokeLater( new Runnable() { public void run() // updates displayArea { displayArea.append(messageToDisplay); } } ); } // manipulates enterField in the event-dispatch thread private void setTextFieldEditable(final boolean editable) { SwingUtilities.invokeLater( new Runnable() { public void run() // sets enterField's editability { enterField.setEditable(editable); } } ); } public static void main(String[] args) { Client application; // declare client application // if no command line args if (args.length == 0) application = new Client("127.0.0.1"); // connect to localhost else application = new Client(args[0]); // use args to connect application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); application.runClient(); // run client application } }
Server.java
// Fig. 28.3: Server.java // Server portion of a client/server stream-socket connection. import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Server extends JFrame { private JTextField enterField; // inputs message from user private JTextArea displayArea; // display information to user private ObjectOutputStream output; // output stream to client private ObjectInputStream input; // input stream from client private ServerSocket server; // server socket private Socket connection; // connection to client private int counter = 1; // counter of number of connections // set up GUI public Server() { super("Server"); enterField = new JTextField(); // create enterField enterField.setEditable(false); enterField.addActionListener( new ActionListener() { // send message to client public void actionPerformed(ActionEvent event) { sendData(event.getActionCommand()); enterField.setText(""); } } ); add(enterField, BorderLayout.NORTH); displayArea = new JTextArea(); // create displayArea add(new JScrollPane(displayArea), BorderLayout.CENTER); setSize(300, 150); // set size of window setVisible(true); // show window } // set up and run server public void runServer() { try // set up server to receive connections; process connections { server = new ServerSocket(12345, 100); // create ServerSocket while (true) { try { waitForConnection(); // wait for a connection getStreams(); // get input & output streams processConnection(); // process connection } catch (EOFException eofException) { displayMessage("\nServer terminated connection"); } finally { closeConnection(); // close connection ++counter; } } } catch (IOException ioException) { ioException.printStackTrace(); } } // wait for connection to arrive, then display connection info private void waitForConnection() throws IOException { displayMessage("Waiting for connection\n"); connection = server.accept(); // allow server to accept connection displayMessage("Connection " + counter + " received from: " + connection.getInetAddress().getHostName()); } // get streams to send and receive data private void getStreams() throws IOException { // set up output stream for objects output = new ObjectOutputStream(connection.getOutputStream()); output.flush(); // flush output buffer to send header information // set up input stream for objects input = new ObjectInputStream(connection.getInputStream()); displayMessage("\nGot I/O streams\n"); } // process connection with client private void processConnection() throws IOException { String message = "Connection successful"; sendData(message); // send connection successful message // enable enterField so server user can send messages setTextFieldEditable(true); do // process messages sent from client { try // read message and display it { message = (String) input.readObject(); // read new message displayMessage("\n" + message); // display message } catch (ClassNotFoundException classNotFoundException) { displayMessage("\nUnknown object type received"); } } while (!message.equals("CLIENT>>> TERMINATE")); } // close streams and socket private void closeConnection() { displayMessage("\nTerminating connection\n"); setTextFieldEditable(false); // disable enterField try { output.close(); // close output stream input.close(); // close input stream connection.close(); // close socket } catch (IOException ioException) { ioException.printStackTrace(); } } // send message to client private void sendData(String message) { try // send object to client { output.writeObject("SERVER>>> " + message); output.flush(); // flush output to client displayMessage("\nSERVER>>> " + message); } catch (IOException ioException) { displayArea.append("\nError writing object"); } } // manipulates displayArea in the event-dispatch thread private void displayMessage(final String messageToDisplay) { SwingUtilities.invokeLater( new Runnable() { public void run() // updates displayArea { displayArea.append(messageToDisplay); // append message } } ); } // manipulates enterField in the event-dispatch thread private void setTextFieldEditable(final boolean editable) { SwingUtilities.invokeLater( new Runnable() { public void run() // sets enterField's editability { enterField.setEditable(editable); } } ); } public static void main(String[] args) { Server application = new Server(); // create server application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); application.runServer(); // run server application } }
Maintained by John Loomis, updated Mon Apr 10 15:09:32 2017