Jiang Yuan@Yale found that the Tester class of current skeleton program for hw5 does not work; specifically, when running $ rmic Tester after compiling Tester class, compilation of RMIC does not go through. Therefore, the Tester class can not be run as a part of the program. The sample output of compilation problem is as follows: hx23@macaw:~/java/hw5/Tester> rmic Tester java.lang.Exception: compiler exited with status: 1 at gnu.java.rmi.rmic.CompilerProcess.compile(java.lang.String) (/usr/lib/libgcj.so.4.0.0) at gnu.java.rmi.rmic.RMIC.compile(java.lang.String) (/usr/lib/libgcj.so.4.0.0) at gnu.java.rmi.rmic.RMIC.processClass(java.lang.String) (/usr/lib/libgcj.so.4.0.0) at gnu.java.rmi.rmic.RMIC.run() (/usr/lib/libgcj.so.4.0.0) at gnu.java.rmi.rmic.RMIC.main(java.lang.String[]) (/usr/lib/libgcj.so.4.0.0) Note that "rmic" stands for RMI Compiler, and rmic compiles for Tester program and generates new .java and .class files (Tester_Skel.java, Tester_Stub.java, etc). So do not get confused by the new files generated by rmic. There is a simple fix to the above problem. Notice that TestInter.java declares the member functions of class Tester, while the implementation of these functions are in Tester.java. If you look at these two files, you will find that two functions have different declarations: one of them is Source(...), and the other is Sink(...). If you make the functions in Tester.java have the same interface as that in TestInter.java, then the compilation problem goes away. To fix the problem, you can simply add "throws RemoteException" between Sink(...)/Source(...) and { in Tester.java. For example, the definition of Source(...) in Tester.java is as follows: public void Source(int localPort, String remoteDN, int remotePort, int aBufSize) { and you should change it to: public void Source(int localPort, String remoteDN, int remotePort, int aBufSize) throws RemoteException { The same modification should be applied to Sink(...) in Tester.java.