Flexible Design

Listing 1. The Receiver and Sender classes can readily incorporate encrypted communication through their use of socket factories.

package example;

import java.io.*;
import java.net.*;
import javax.net.*;

public class Receiver {
   private ServerSocketFactory factory;
   private int port;
   private byte[] buffer;

   public Receiver(int port) {
      setPort(port);
      setServerSocketFactory(
         ServerSocketFactory.getDefault());
      buffer    = new byte[2048];
   }

   public Receiver() {
      this(0);
   }

   public void setPort(int port) {
      this.port = port;
   }

   public void setServerSocketFactory(
      ServerSocketFactory factory) {
      this.factory = factory;
   }

   public void receive(
      OutputStream out) throws IOException {
      int bytes;
      ServerSocket server;
      Socket client;
      InputStream in;

      server = factory.createServerSocket(port);
      client = server.accept();
      in     = client.getInputStream();

      while((bytes = in.read(buffer)) >= 0)
         out.write(buffer, 0, bytes);

      client.close();
      server.close();
   }
}