ࡱ > [@ bjbj44 Vi Vi 7 ` ` ` t l l l 8 l `m l t o o " o o o p p p T V V V V V V $ R z z ` q p p q q z o o q 7 R o ` o T q T V \ @ > " ` o o m9< l L! T 0 x W W t t W ` 4 p " p q 'q p p p z z t t x $ t t x Lab 3 Due on Wednesday March 22, 2006
Lab Topics: UDP, TCP, SOAP and hand coded RMI
In the next lab you will be working with Java RMI, .NET Remoting and Web Services middleware. In this lab you will be working without middleware support. You will have to deal with some issues that middleware layers abstract away.
In the first part of this homework you will work with UDP and TCP over IP. In the second part you will work with a low level SOAP-like application. In the third part you will work with low level RMI in Java.
PART I UDP and TCP From Chapter 4 of Text
On pages 138 and 139 of the Coulouris text, two short programs are presented. Make modifications to the UDPClient.java program and the UDPServer.java program so that the client may ask the server to perform simple integer arithmetic. You only need implement addition of primitive integers. In this part of this lab you need not worry about exceptions. The execution of the client program will look like the following:
java UDPClient 100 + 234
Reply:334
Submit a copy of these two modified java programs (UDPClient.java and UDPServer.java).
On pages 142 and 143 of the Coulouris text, two short programs are presented. Make modifications to the TCPClient.java program and the TCPServer.java program so that the client may ask the server to perform simple integer arithmetic. You only need implement addition of primitive integers. In this part of this lab you need not worry about exceptions.The execution of the client program will look like the following:
java TCPClient 100 + 234
Reply:334
Submit a copy of these modified java programs (TCPClient.java and TCPServer.java).
Part II Low Level SOAP-like Middleware
Figure 3.1 is a Java class that is designed to encapsulate a service request. Currently, it has no main method. Write a main method that creates a ServiceRequest object and sets its request type to Arithmetic service. Your main method will then call on the appropriate ServiceRequest method to display the XML service request document. In order to compile this program, you will need HttpServiceException (Figure 3.7) in the same directory.
For example, the output of your main routine will look as follows:
C:>java ServiceRequest
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import org.w3c.dom.*;
/**
* class that extends ServiceRequest to simplify a DBService request
* handling
* This is a valid DBService request
*
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import java.io.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.*;
import org.apache.xml.serialize.XMLSerializer; // not standard
import org.apache.xml.serialize.OutputFormat; // not standard
/**
* identifies the XML response
* here is an example for a correct XML response
*
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import java.util.*;
import org.w3c.dom.*;
/**
* class that extends ServiceRequest to simplify DBService resposne
* handling
* This is a valid response
*
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import java.util.*;
import java.sql.*;
public class DBServiceHandler extends HttpServiceHandler
{
public ServiceResponse processRequest(ServiceRequest req)
throws HttpServiceException
{
DBServiceRequest request = new DBServiceRequest(req);
String sql = request.getSqlStatement();
DBServiceResponse response = new DBServiceResponse();
Connection connection;
response.setResponseCode(200);
response.setResponseMessage("OK");
Vector resultSet = new Vector();
Vector row = new Vector();
row.add("Col1");
row.add("Col2");
row.add("Col3");
resultSet.add(row);
row = new Vector();
row.add("Val11");
row.add("Val12");
row.add("Val13");
resultSet.add(row);
row = new Vector();
row.add("Val21");
row.add("Val22");
row.add("Val23");
resultSet.add(row);
row = new Vector();
row.add("Val31");
row.add("Val32");
row.add("Val33");
resultSet.add(row);
response.setResultSet(resultSet);
response.setResultsCount(3);
return response;
/*
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
String connectionString =
"jdbc:oracle:thin:@fender.openport.com:1521:iplp";
connection =
DriverManager.getConnection(connectionString ,"op1","op1");
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace(System.err);
response.setResponseCode(400);
response.setResponseMessage("Oracle driver not found");
return response;
}
catch(SQLException ex2)
{
ex2.printStackTrace(System.err);
response.setResponseCode(400);
response.setResponseMessage("Could Not Connect To Database!");
return response;
}
String theSql = sql.trim().toUpperCase();
ResultSet resultSet;
try
{
Statement statement = connection.createStatement();
if(theSql.startsWith("SELECT"))
{
resultSet = statement.executeQuery(theSql);
Vector theResults = parseResultSet(resultSet);
response.setResultsCount(theResults.size() - 1);
response.setResultSet(theResults);
}
else
{
statement.executeUpdate(theSql);
response.setResultsCount(-1);
response.setResultSet(new Vector());
}
}catch(SQLException ex)
{
response.setResponseCode(400);
response.setResponseMessage(ex.getMessage());
return response;
}
response.setResponseCode(200);
response.setResponseMessage("OK");
String res = response.serializeResponseToString("utf-8");
System.out.println(res);
return response;
*/
}
private Vector parseResultSet(ResultSet resultSet) throws SQLException
{
Vector results = new Vector();
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
int ii;
Vector row = new Vector(count);
for(ii= 0; ii < count; ii++)
{
row.addElement(metaData.getColumnName(ii + 1));
}
results.addElement(row);
String value;
while(resultSet.next())
{
row = new Vector(count);
for(ii =0; ii < count; ii++)
{
value = resultSet.getString(ii + 1);
row.addElement(value == null ? "":value);
}
results.addElement(row);
}
return results;
}
} Figure 3.6
/** Figure 3.7
* Title:
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
/**
* The main exception for the HttpService
*/
public class HttpServiceException extends Exception
{
public HttpServiceException()
{
super();
}
public HttpServiceException(String message)
{
super(message);
}
}
Figure 3.7
/** Figure 3.8
* Title:
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
/**
* This is the Base class for all Service Handlers class
* The only abstract method is processRequest
* The HttpService will call first setup, the handleRequest.
* handle request will cal the process request method
*/
public abstract class HttpServiceHandler
{
protected HttpServletRequest req;
protected HttpServletResponse res;
public HttpServiceHandler()
{
}
public void setup(HttpServletRequest request, HttpServletResponse response)
{
req = request;
res = response;
}
public void sendResponse(ServiceResponse response)
throws HttpServiceException
{
try
{
res.setContentType("text/xml");
byte[] data = response.serializeResponseToByteArray("utf-8");
res.setContentLength(data.length);
res.getOutputStream().write(data);
}
catch(Exception ex)
{
ex.printStackTrace(System.err);
throw new HttpServiceException(ex.getMessage());
}
}
public void handleRequest(ServiceRequest request)
throws HttpServiceException
{
sendResponse(processRequest(request));
}
protected abstract ServiceResponse processRequest(ServiceRequest request)
throws HttpServiceException;
} //Figure 3.8
Figure 3.9
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
public class HttpService extends HttpServlet
{
private final static String PACKAGE_NAME = "httpService";
/**Initialize global variables*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
/**Process the HTTP Get request*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
throw new ServletException("This application only responds to a POST request");
}
/**Process the HTTP Post request*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
try
{
// get the XML payload and parse it into a Document
DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder =
docBuilderFactory.newDocumentBuilder();
Document dom;
InputSource input = new InputSource(request.getInputStream());
dom = docBuilder.parse(input);
// Wrap the document as a ServiceRequest
ServiceRequest serviceRequest = new ServiceRequest(dom);
// Read the type of request
String requestType = serviceRequest.getRequestType();
// Load the handler class
Class handlerClass = Class.forName(requestType + "Handler");
// Create an instance
HttpServiceHandler handler = (HttpServiceHandler) handlerClass.newInstance();
// Let the handler have the request and response objects
handler.setup(request,response);
// handle the request
handler.handleRequest(serviceRequest);
}
catch(Exception ex)
{
System.out.println("Exception thrown in HttpService");
ex.printStackTrace();
throw new ServletException(ex);
}
}
/**Clean up resources*/
public void destroy()
{
}
}
// Figure 3.9
/** Figure 3.10
* Title:
* Description:
* Copyright: Copyright (c) Daniel Nehren
* Company: Openport Technology Inc.
* @author Daniel Nehren
* @version 1.0
*/
import java.net.*;
import java.util.*;
import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;
import org.apache.xerces.*;
import org.xml.sax.InputSource;
/**
* This class encapsulates all the interaction with an HttpService
*/
public class HttpServiceClient
{
private static final String HTTP_VERSION = "1.0";
private static final String HTTP_POST_REQUEST = "POST";
private static final String HEADER_HOST = "Host";
private static final String HEADER_CONTENT_TYPE = "Content-Type";
private static final String XML_MIME_TYPE = "text/xml";
private static final String HEADER_CONTENT_LENGTH = "Content-Length";
private static final int DEFAULT_PORT = 80;
private String serviceUrl;
private int returnCode;
private String returnMessage;
private Reader responsePayload;
public HttpServiceClient( String serviceUrl)
{
this.serviceUrl = serviceUrl;
}
public ServiceResponse executeRequest(ServiceRequest request)
throws HttpServiceException
{
try
{
String data = request.serializeRequestToString("utf-8");
postRequest(data);
//check for failures
if(returnCode != 200)
throw new HttpServiceException(returnMessage);
InputSource source = new InputSource(responsePayload);
DOMParser parser = new DOMParser();
parser.parse(source);
ServiceResponse serviceResponse = new ServiceResponse(parser.getDocument());
String theResponse = serviceResponse.serializeResponseToString("utf-8");
System.err.println(theResponse);
return serviceResponse;
}
catch(Exception ex)
{
ex.printStackTrace(System.err);
throw new HttpServiceException(ex.getMessage());
}
}
private void postRequest(String payload)
throws HttpServiceException
{
PrintWriter out = null;
BufferedReader in = null;
URL url = null;
try
{
url = new URL(serviceUrl);
// No port? use default port 80
int port = url.getPort () < 0 ? DEFAULT_PORT : url.getPort();
Socket soket = new Socket (url.getHost (), port);
out = new PrintWriter (soket.getOutputStream ());
in = new BufferedReader (
new InputStreamReader (soket.getInputStream ()));
}
catch (Exception ex)
{
throw new HttpServiceException ("error opening socket: " +
ex.getMessage ());
}
out.print (HTTP_POST_REQUEST + " " + url.getFile() + " HTTP/" + HTTP_VERSION +
"\r\n");
out.print (HEADER_HOST + ": " + url.getHost () + ':' + url.getPort () +
"\r\n");
out.print (HEADER_CONTENT_TYPE + ": " + XML_MIME_TYPE + "\r\n");
out.print (HEADER_CONTENT_LENGTH + ": " + payload.length () + "\r\n");
out.print ("\r\n");
out.print (payload);
out.print ("\r\n\r\n");
out.flush ();
try
{
String statusLine = in.readLine();
System.err.println(statusLine);
parseStatusLine(statusLine);
}
catch (Exception ex)
{
throw new HttpServiceException ("error parsing HTTP status line: " +
ex.getMessage ());
}
// I will ignore all the headers keep reading until I get an empty line
try
{
String headerLine = null;
while ((headerLine = in.readLine ()) != null)
{
System.err.println(headerLine);
if (headerLine.length () == 0)
break;
}
}
catch (Exception ex)
{
throw new HttpServiceException ("error reading HTTP headers: " +
ex.getMessage ());
}
//what remains of the input Stream is my payload
responsePayload = in;
}
private void parseStatusLine(String statusLine) throws Exception
{
StringTokenizer st = new StringTokenizer (statusLine);
// this is the HTTP Version
st.nextToken ();
returnCode = Integer.parseInt (st.nextToken ());
StringBuffer retMessage = new StringBuffer ();
while (st.hasMoreTokens ())
{
retMessage.append (st.nextToken ());
if (st.hasMoreTokens ()) {
retMessage.append (" ");
}
}
returnMessage = retMessage.toString ();
}
} //Figure 3.10
// Figure 3.11
// file: Interface.java on both the client and server side
public interface Person {
public int getAge() throws Throwable;
public String getName() throws Throwable;
} // Figure 3.11
// Figure 3.12
// file: Person_Stub.java found only on the client side
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
public class Person_Stub implements Person {
Socket socket;
ObjectOutputStream o;
ObjectInputStream i;
public Person_Stub() throws Throwable {
}
public int getAge() throws Throwable {
socket = new Socket("localhost",9000);
o = new ObjectOutputStream(socket.getOutputStream());
o.writeObject("age");
o.flush();
i = new ObjectInputStream(socket.getInputStream());
int ret = i.readInt();
socket.close();
return ret;
}
public String getName() throws Throwable {
socket = new Socket("localhost",9000);
o = new ObjectOutputStream(socket.getOutputStream());
o.writeObject("name");
o.flush();
i = new ObjectInputStream(socket.getInputStream());
String ret = (String)(i.readObject());
socket.close();
return (String)ret;
}
} //Figure 3.12
// Figure 3.13
// file: PersonClient.java exists only on the client side
public class PersonClient {
public static void main(String args[]) {
try {
// read and display the name and the age of the person represented
// by the remote object
Person p = new Person_Stub();
int age = p.getAge();
System.out.println("Age = " + age);
String name = p.getName();
System.out.println(name + " is " + age + " years old");
}
catch(Throwable t) {
t.printStackTrace();
System.exit(0);
}
}
} // Figure 3.13
// Figure 3.14
// file: Person_Skeleton.java exists only on the server side
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.ServerSocket;
public class Person_Skeleton {
Person myServer;
public Person_Skeleton(Person s) {
myServer = s;
}
public void serve() {
try {
ServerSocket s = new ServerSocket(9000);
while(true) {
Socket socket = s.accept();
ObjectInputStream i = new ObjectInputStream(socket.getInputStream());
String method = (String)i.readObject();
if(method.equals("age")) {
int a = myServer.getAge();
ObjectOutputStream o = new ObjectOutputStream(socket.getOutputStream());
o.writeInt(a);
o.flush();
}
else if(method.equals("name")) {
String n = myServer.getName();
ObjectOutputStream o = new ObjectOutputStream(socket.getOutputStream());
o.writeObject(n);
o.flush();
}
}
}
catch(Throwable t) {
System.out.println("Error " + t);
System.exit(0);
}
}
} // Figure 3.14
// Figure 3.15
// file: Person_Servant.java exists only on the server side
public class Person_Servant implements Person {
int age;
String name;
public Person_Servant(String n, int a) {
name = n;
age = a;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
} // Figure 3.15
// Figure 3.16
// file: PersonServer.java exists only on the server side
public class PersonServer {
public static void main(String args[]) {
// create and object representing a person
// and server it to clients
Person p = new Person_Servant("Mike",23);
Person_Skeleton ps = new Person_Skeleton(p);
ps.serve();
}
} // Figure 3.16
95-702 Organizational Communication & Distributed Object Technologies Carnegie Mellon University
PAGE
PAGE 1
& ' ( , 4 F R U V W A
'
>
?
@
T
* b ¼³tje]U hD| h7_ \hD| h8z' \ h;V \h7 h7_ CJ \h6 hyX 5>*CJ \aJ h6 h7_ 5>*CJ \aJ
h7_ CJ \hD| h > hD| h,M hn hz hnb hnb hK CJ
hnb CJ hnb h,M CJ hnb hnb CJ \
h CJ \hnb 5CJ \ hK 5CJ \ h? 5CJ \ h,A 5CJ \ & ' ( V W @ A
?
@
~ h^hgd7_ h^hgd8z' gd8z' ^gd8z'
&