Object Transport
An Introduction with Examples in Java |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
import java.io.Serializable; /** * A Course * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class Course implements Serializable { private static final long serialVersionUID = 1L; private int number; private String department, title; /** * Explicit Value Constructor * * @param department The department code * @param number The course number * @param title The course title */ public Course(String department, int number, String title) { this.department = department; this.number = number; this.title = title; } /** * Get the course designation * * @return The course designation */ public String getDesignation() { return department+number; } /** * Get the course title * * @return The course title */ public String getTitle() { return title; } }
import java.io.Serializable; import java.util.Iterator; import java.util.HashMap; /** * A database of Course objects * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class CourseDatabase implements Serializable { private static final long serialVersionUID = 1L; private HashMap<String, Course> db; /** * Constructor */ public CourseDatabase() { db = new HashMap<String,Course>(); } /** * Add a Course * * @param id The identifier * @param course The Course to add */ public void add(String id, Course course) { db.put(id, course); } /** * Get the values (i.e., Course objects) in the database * * @return The values */ public Iterator<Course> iterator() { return db.values().iterator(); } /** * Get a Course * * @param department The department identifier * @param number The course number * @return The Course to get */ public Course get(String department, int number) { return db.get(department+number); } /** * Remove a Course * * @param department The department identifier * @param number The course number */ public void remove(String department, int number) { db.remove(department+number); } }
ObjectOutputStream
and
ObjectInputStream
classes are used to serialize and
deserialize objectsSocket
import java.io.*; import java.net.*; import java.util.*; /** * An example of sending a serialized object over the Internet * using TCP. * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class CourseDatabaseServer { public static void main(String[] args) { Course cross; CourseDatabase db; ObjectOutputStream out; ServerSocket ss; Socket s; cross = new Course("CS/MATH",227,"Discrete Mathematics"); db = new CourseDatabase(); db.add("CS139", new Course("CS",139,"Algorithm Development")); db.add("CS227", cross); db.add("CS240", new Course("CS",240,"Data Structures and Algorithms")); db.add("MATH227", cross); try { ss = new ServerSocket(9100); s = ss.accept(); out = new ObjectOutputStream(s.getOutputStream()); out.writeObject(db); out.flush(); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
import java.io.*; import java.net.*; import java.util.*; /** * An example of receiving a serialized object over the Internet * using TCP. * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class CourseDatabaseClient { public static void main(String[] args) { Course course; CourseDatabase db; Iterator<Course> i; InetAddress ip; Socket s; ObjectInputStream in; try { ip = InetAddress.getByName("localhost"); s = new Socket(ip, 9100); in = new ObjectInputStream(s.getInputStream()); db = (CourseDatabase)in.readObject(); in.close(); s.close(); i = db.iterator(); while (i.hasNext()) { course = i.next(); System.out.println(course.getDesignation()+"\t"+ course.getTitle()); } } catch (Exception ex) { ex.printStackTrace(); } } }
ByteArrayOutputStream
and
ByteArrayInputStream
can be used to create
a stream from an array of bytesDatagramPacket
as a stream
import java.io.*; import java.net.*; import java.util.*; /** * An example of receiving a serialized object over the Internet * using UDP. * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class CourseDatabaseReceiver { public static void main(String[] args) throws Exception { // Construct the UDP socket (for receiving) DatagramSocket socket = new DatagramSocket(22801); // Construct the UDP datagram byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // "Wait" to receive a packet socket.receive(packet); // Construct a ByteArrayInputStream from the payload ByteArrayInputStream bais = new ByteArrayInputStream(buffer); // Decorate the ByteArrayInputStream ObjectInputStream in = new ObjectInputStream(bais); // Deserialize CourseDatabase db = (CourseDatabase)in.readObject(); in.close(); // Use the deserialized CourseDatabase Iterator<Course> i = db.iterator(); while (i.hasNext()) { Course course = i.next(); System.out.println(course.getDesignation()+"\t"+ course.getTitle()); } } }
import java.io.*; import java.net.*; import java.util.*; /** * An example of sending a serialized object over the Internet * using UDP * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class CourseDatabaseSender { public static void main(String[] args) throws Exception { InetAddress ip; if (args.length > 0) ip = InetAddress.getByName(args[0]); else ip = InetAddress.getByName("localhost"); // Construct and populate a CourseDatabase Course cross = new Course("CS/MATH",227,"Discrete Mathematics"); CourseDatabase db = new CourseDatabase(); db.add("CS139", new Course("CS",139,"Algorithm Development")); db.add("CS227", cross); db.add("CS240", new Course("CS",240,"Data Structures and Algorithms")); db.add("MATH227", cross); // Construct a ByteArayOutputStream ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Decorate the ByteArrayOutputStream ObjectOutputStream out = new ObjectOutputStream(baos); // Serialize the CourseDatabase out.writeObject(db); out.close(); // Construct the UDP packet byte[] data = baos.toByteArray(); DatagramPacket datagram = new DatagramPacket(data, data.length, ip, 22801); // Construct the UDP socket (for sending) DatagramSocket socket = new DatagramSocket(); // Send the serialized CourseDatabase socket.send(datagram); } }