TCP for Text Transport
An Introduction with Examples in Java |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
// Create a server socket to wait for a connection ss = new ServerSocket(port); // Accept the connection (i.e., complete the handshaking) // Note: This method blocks. s = ss.accept(); // Get an input stream and construct a reader in = new BufferedReader( new InputStreamReader(s.getInputStream())); // Get an output stream and construct a writer out = new PrintWriter(s.getOutputStream()); // Read and write to the two streams as required // by the application
// Create a connection to a particular host and port s = new Socket(host, port); // Get an output stream and construct a writer out = new PrintWriter(s.getOutputStream()); // Get an input stream and construct a reader in = new BufferedReader( new InputStreamReader(s.getInputStream())); // Read and write to the two streams as required // by the application
ServerSocket
Objects and Threadsaccept()
method blocks so, in most cases,
it will need to be called in a thread of execution
controlled by the serveraccept()
method time-out
import java.io.*; import java.net.*; /** * A single-threaded ECHO server that also converts to uppercase * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class UppercaseEchoServer implements Runnable { private volatile boolean keepRunning; private BufferedReader in; private int port; private PrintWriter out; private ServerSocket ss; private Socket s; private Thread controlThread; /** * Default Constructor */ public UppercaseEchoServer() { this(9462); } /** * Explicit Value Constructor * * @param port The port the server should listen to */ public UppercaseEchoServer(int port) { this.port = port; } /** * The code that is executed in the controlThread object's * thread of execution */ public void run() { String line; try { // Create a server socket to wait for a connection ss = new ServerSocket(port); // Set the timeout for the accept() method ss.setSoTimeout(5000); while (keepRunning) { try { // Accept the connection (i.e., complete the handshaking) // Note: This method blocks. s = ss.accept(); // Get an input stream and construct a reader in = new BufferedReader( new InputStreamReader(s.getInputStream())); // Get an output stream and construct a writer out = new PrintWriter(s.getOutputStream()); // Read and write to the two streams as required // by the application // In this case, read a line line = in.readLine(); System.out.println(line); // Convert the line to uppercase and write it out out.println(line.toUpperCase()); // Flush the output stream out.flush(); // Close the socket when done s.close(); } catch (SocketTimeoutException ste) { // The accept() method timed out. Check to see if // the tread should keep running or not. } catch (IOException ioe) { // Had a problem with the Socket. Start accepting // connections again. } } } catch (IOException ioe) { // Big problem so exit ioe.printStackTrace(); System.exit(1); } } /** * Start the thread of execution */ public void start() { if (controlThread == null) { controlThread = new Thread(this); keepRunning = true; controlThread.start(); } } /** * Stop the thread of execution (after it finishes the * current connection) */ public void stop() { keepRunning = false; } }
import java.io.*; /** * A single-threaded ECHO server that also converts to uppercase * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class UppercaseEchoServerDriver { /** * Entry point of the application * * @param args The command-line arguments */ public static void main(String[] args) { BufferedReader in; UppercaseEchoServer server; in = new BufferedReader(new InputStreamReader(System.in)); // Construct and start the server server = new UppercaseEchoServer(9462); server.start(); System.out.println("Press [Enter] to stop the server..."); try { // Block until the user presses [Enter] in.readLine(); } catch (IOException ioe) { System.out.println(" Stopping because of an IOException"); } // Stop the server server.stop(); } }