/** * For ComS 587X : Principles of Network and Distributed Programming, Fall 2003 * Project 2 : Remote Method Invocation and Java Native Interface * @version 2003-10-23 * * @author Jie Bao * Dept of Computer Science * Iowa State University * baojie@cs.iastate.edu * http://www.cs.iastate.edu/~baojie/acad/course/cs587/cs587.htm * */ Readme c Compiler: MinGW as gcc under windows [http://www.mingw.org/ ] & gcc under Redhat Linux 9.0 java Compiler: JDK1.4.2_02 under windows: To Build : run make.bat please make sure the java path in the file is fit to your setting To Run the program, run the following batch file IN ORDER launchrmi.bat runserver.bat runclient.bat under linux To Build : run makelin please make sure the java path in the file is fit to your setting To To Run the program rmiregistry java Server localhost java Client localhost if can't run, try setenv LD_LIBRARY_PATH ./ You may launch more than one client. Each of them has a unique ID and all connected to the server.
The java Code
Click on the diagram to find each class's information

Example output of one server and two client
2003-10-25
clients:
rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.93.7:1628](local),objID:[0]]]]
rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.93.7:1641](local),objID:[0]]]]
server:
rmi://localhost/BeaconListener
|
Server Output
Y:\hw2\src>java Server localhost
Server launched
[BeaconListenerImpl] Launched
[BeaconListenerImpl] Recieved a beacon ID = 1, StartUpTime = 1067070965, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 2, StartUpTime = 1067070966, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 3, StartUpTime = 1067070967, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 4, StartUpTime = 1067070968, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 5, StartUpTime = 1067070969, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 6, StartUpTime = 1067070970, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 7, StartUpTime = 1067070971, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 8, StartUpTime = 1067070972, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 9, StartUpTime = 1067070973, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 10, StartUpTime = 1067070974, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 11, StartUpTime = 1067070975, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 12, StartUpTime = 1067070976, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 13, StartUpTime = 1067070977, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 1, StartUpTime = 1067070978, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[BeaconListenerImpl] Recieved a beacon ID = 2, StartUpTime = 1067070978, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 3, StartUpTime = 1067070978, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 4, StartUpTime = 1067070978, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[BeaconListenerImpl] Recieved a beacon ID = 5, StartUpTime = 1067070978, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 14, StartUpTime = 1067070978, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 6, StartUpTime = 1067070979, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 15, StartUpTime = 1067070979, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 7, StartUpTime = 1067070980, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 16, StartUpTime = 1067070980, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 8, StartUpTime = 1067070981, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 17, StartUpTime = 1067070981, CmdAge
ntID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.
93.7:1628](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
[BeaconListenerImpl] Recieved a beacon ID = 9, StartUpTime = 1067070982, CmdAgen
tID = rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [endpoint:[129.186.9
3.7:1641](local),objID:[0]]]]
[ClientAgent] Service begins
[ClientAgent] RMI - java.rmi.UnknownHostException: Unknown host: localhost/CmdAg
entCmdAgentImpl[RemoteStub [ref; nested exception is:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[ClientAgent] Service ends
Terminate batch job (Y/N)? |
Client 1 Output
Y:\hw2\src>java Client localhost
[Client] Client launched
[Client] CmdAgentID : rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [end
point:[129.186.93.7:1641](local),objID:[0]]]]
Unknown host: localhost/CmdAgentCmdAgentImpl[RemoteStub [ref; nested exception i
s:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[BeaconSender] Service begins
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:0) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:1) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:2) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:3) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:4) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:5) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:6) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:7) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:8) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
|
|
Client 2 Output
Y:\hw2\src>java Client localhost
[Client] Client launched
[Client] CmdAgentID : rmi://localhost/CmdAgentCmdAgentImpl[RemoteStub [ref: [end
point:[129.186.93.7:1628](local),objID:[0]]]]
[BeaconSender] Service begins
Unknown host: localhost/CmdAgentCmdAgentImpl[RemoteStub [ref; nested exception i
s:
java.net.UnknownHostException: localhost/CmdAgentCmdAgentImpl[RemoteStub
[ref
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:0) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:1) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:2) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:3) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:4) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:5) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:6) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:7) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:8) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:9) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:10) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:11) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:12) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:13) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:14) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:15) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[BeaconSender] Send a beacon (ID:16) to the beacon listener
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
[C Native] GetLocalTime is runing
[C Native] GetLocalTime is exiting
Terminate batch job (Y/N)? |
===================================
Attachment: the problem: http://www.cs.iastate.edu/~cs587x/homework/hw2.html
Name this program server.java: The server registers a remote object that provides the following interface:
public interface BeaconListener extends java.rmi.remote
{
public int deposit(Beacon b);
}
This interface is called by clients to deposit their beacons periodically. When the server determines that
a beacon, say b, is from a new client, it launches a new thread called ClientAgent(b). The thread first
locates the client's CmdAgent, a remote object registered by the client, then calls
CmdAgent.execute("GetLocalTime", CmdObject), where CmdObject is an object of class GetLocalTime:
public class GetLocalTime
{
int time;
char valid;
}
What is the execution time of execute()?
Name this program client.java: write a java program that spawns two threads, CmdRegister and BeaconSender:
CmdRegister registers a remote object that provides the following interface:
public interface CmdAgent extends java.rmi.remote
{
public int execute(String CmdID, Object CmdObj);
}
This interface is used by server for command execution. The implementation of execute is as follows:
public int execute(String CmdID, Object CmdObj)
{
if (CmdID.equal("GetLocalTime")
{
return C_GetLocalTime((GetLocalTime) CmdObj);
}
else
...
}
The implementation of C_GetLocalTime must be done using C/C++ as a native method. The pseudo code is as follows:
int C_GetLocalTime execute(jobject cmdobj)
{
1. Set cmdobj.valid = 0
2. Get current system time and store it to cmdobj.time.
3. If step 2 is successful, set cmdobj.valid = 1
}
BeaconSender periodically (e.g., each minute) deposit a BEACON object to the server using RMI:
class BEACON
{
int ID; /* randomly generated at startup */
int StartUpTime; /* the time when this client starts */
String CmdAgentID; /* the registry string of CmdAgent */
}
Note that CmdAgentID must be unique to so that you can run more than one client. You can use this to construct
the registry string for a CmdAgent: IP + ":" + UID + "/CmdAgent". UID is a random number.
[Return to Jie Bao's Homepage]