Write an RMI application that allows a client to open and re
Write an RMI application that allows a client to open and read a le residing on a remote server. The interface for accessing the remote le object appears as
import java.rmi.*;
public interface RemoteFileObject extends Remote
{
public abstract void open(String fileName)
throws RemoteException;
public abstract String readLine()
throws RemoteException;
public abstract void close()
throws RemoteException;
}
That is, the client will open the remote le using the open() method, where the name of the le being opened is provided as a parameter. The le will be accessed via the readLine() method. This method is implemented similarly to the readLine() method in the java.io.BufferedReaderclassintheJavaAPI.Thatis,itwillreadand returnalineoftextthatisterminatedbyalinefeed(\ ),acarriagereturn (\ ), or a carriage return followed immediately by a line feed. Once the end of the le has been reached, readLine() will return null. Once the le has been read, the client will close the le using the close() method. For simplicity, we assume the le being read is a character (text)stream.Theclientprogramneedonlydisplaytheletotheconsole (System.out). One issue to be addressed concerns handling exceptions. The server will have to implement the methods outlined in the interface RemoteFileObjectusingstandardI/OmethodsprovidedintheJavaAPI,most of which throw a java.io.IOException. However, the methods to be implementedin the RemoteFileObject interface are declaredto throw a RemoteException. Perhaps the easiest way of handling this situation in the server is to place the appropriate calls to standard I/O methods using try-catch for java.io.IOException. If such an exception occurs, catch it, and then re-throw it as a RemoteException. The code might look like this
try {
...
}
catch (java.io.IOException ioe) {
throw new RemoteException(\"IO Exception\",ioe);
}
You can handle a java.io.FileNotFoundException similarly
Please make three classes
RMIClient.java
RMIServer.java
RemoteFileObject.java
Solution
import java.rmi.*;
public class RMIClient
{
static final String server = \"127.0.0.1\";
public static void main(String args[]) {
try {
String host = \"rmi://\" + server + \"/RMIDateObject\";
RemoteDate dateServer = (RemoteDate)Naming.lookup(host);
System.out.println(dateServer.getDate());
}
catch (Exception e) {
System.err.println(e);
}
}
}
The RMI client
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
public class RemoteDateImpl extends UnicastRemoteObject
implements RemoteDate
{
public RemoteDateImpl() throws RemoteException { }
public Date getDate() throws RemoteException {
return new Date();
}
public static void main(String[] args) {
try {
RemoteDate dateServer = new RemoteDateImpl();
// Bind this object instance to the name \"RMIDateObject\"
Naming.rebind(\"RMIDateObject\", dateServer);
}
catch (Exception e) {
System.err.println(e);
}
}
}



