import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.ServerSocket;

public class Person_Skeleton extends Thread {
	Person myPerson;

	public Person_Skeleton(Person person) {
		// Get a reference to the business object that this skeleton wraps
		this.myPerson = person;
	}

	public void run() {
		try {
			// Create a server socket on port 9000
			ServerSocket serverSocket = new ServerSocket(9000);
			System.out.println("Server Socket Waiting for Connection....");
			// Wait for and obtain a socket connection from the stub
			Socket socket = serverSocket.accept();
			System.out.println("Socket Connection Accepted!");
			
			while (socket!=null) 
			{
				// Create an input stream to receive requests from the stub
				ObjectInputStream inStream = 
					new ObjectInputStream(socket.getInputStream());
				// Read the next method request from the stub
				String method = (String)inStream.readObject();
				
				if (method.equals("age")) {
					// Invoke the business method on the server object
					int age = myPerson.getAge();
					// Create an output stream to send return values back to the stub
					ObjectOutputStream outStream = 
						new ObjectOutputStream(socket.getOutputStream());
					outStream.writeInt(age);
					outStream.flush();
				}

				else if (method.equals("name")) {
					String name = myPerson.getName();
					ObjectOutputStream outStream = 
						new ObjectOutputStream(socket.getOutputStream());
					outStream.writeObject(name);
					outStream.flush();
				}
			}			
		}  catch (Throwable t) {
			System.out.println("Connection Reset!"); 
			//t.printStackTrace();
			System.exit(0); 
		}	

	}

	
	public static void main(String args[]) {
		// Obtain a unique Person instance
		Person person = new Person("David", 99);
		Person_Skeleton skel = new Person_Skeleton(person);
		skel.start();
	}
}

