Pasar al contenido principal

Práctica 11

Versión para impresiónSend by email

Esta práctica muestra el funcionamiento de un RMI (Remote Method Invocation)


 

import java.io.File;
import java.io.RandomAccessFile;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;

public class ServidorFicherosImpl 
   extends UnicastRemoteObject
   implements ServidorFicheros {

   public ServidorFicherosImpl() throws RemoteException {
      super();
   }

   public synchronized byte[] read(String nombreFichero, int numBytes, long pos) {
     try {
       RandomAccessFile f= new RandomAccessFile(nombreFichero, "r");
       f.seek(pos);
       int cuenta;
       byte[] buf=new byte[numBytes];
       cuenta= f.read(buf);
       f.close();
       if (cuenta < numBytes) {
          byte[]shortbuf=new byte[cuenta];
          System.arraycopy(buf, 0, shortbuf, 0, cuenta);
          return shortbuf;
       }
       else
          return buf;
     } 
     catch (Exception e) {
       System.err.println("Error '"
                           + e.getMessage() 
                           + "' ejecutando read sobre: "
                           + nombreFichero);
       return null;
     }
   }

   public synchronized void write(String nombreFichero, byte[] datos, long pos) {
     try {
       RandomAccessFile f= new RandomAccessFile(nombreFichero, "rw");
       f.seek(pos);
       f.write(datos);
       f.close();
       return;
     }
     catch (Exception e) {
       System.err.println("Error '"
                           + e.getMessage() 
                           + "' ejecutando write sobre: "
                           + nombreFichero);
       return;
     }
   }

   public static void main(String argv[]) {
      if (System.getSecurityManager() == null) 
          System.setSecurityManager(new RMISecurityManager());
      try {
         ServidorFicheros fi = new ServidorFicherosImpl();
         Naming.rebind("//127.0.0.1/ServidorFicheros", fi);
      } 
      catch(Exception e) {
         System.out.println("ServidorFicheros: "+e.getMessage());
      }
   }
}				        				        					 

 

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ServidorFicheros extends Remote {

   public byte[] read(String nombreFichero, int numBytes, long pos) 
      throws RemoteException;

   public void write(String nombreFichero, byte[] datos, long pos) 
      throws RemoteException;

}				        				        					 

 

import java.io.*; 
import java.rmi.*;

public class RMIlee {

   public static void main(String argv[]) {
      if (argv.length != 2) {System.err.println("Uso: RMIlee nombreFichero nombreMaquina"); System.exit(1);}
      try {
         String nombre = "//" + argv[1] + "/ServidorFicheros";
         ServidorFicheros fs = (ServidorFicheros) Naming.lookup(nombre);
         byte[] datos;
         long pos = 0;
         do {
           datos=fs.read(argv[0],1024, pos);
           System.out.write(datos);
           pos+= 1024;
         } 
         while (datos.length == 1024);
      } 
      catch (RemoteException e) { System.err.println("Excepcion remota: "+ e.getMessage()); }
      catch (Exception e) { System.err.println("Excepcion: "+ e.getMessage()); }
   }
}				        				        					 

 

import java.io.File;
import java.io.FileInputStream;
import java.io.*; 
import java.rmi.*;

public class RMIesc { 

   public static void main(String argv[]) {
      if (argv.length != 2) {System.err.println("Uso: RMIesc nombreFichero nombreMaquina"); System.exit(1);}
      try {
         String nombre = "//" + argv[1] + "/ServidorFicheros";
         ServidorFicheros fs = (ServidorFicheros) Naming.lookup(nombre);
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         String line = null;
         line = br.readLine();
         long pos = 0;
         while (line != null) {
           line+= "\n";
           byte[] data = line.getBytes();
           fs.write(argv[0], data, pos);
           pos += data.length;
           line = br.readLine();
         }
      }
      catch (RemoteException e) { System.err.println("Excepcion remota: "+ e.getMessage()); }
      catch (Exception e) { System.err.println("Excepcion: "+ e.getMessage()); }
   }
}				        				        					 

 
permisosServidor.txt - Archivo para pasar como parámetro a la ejecución del servidor

grant {
  permission java.security.AllPermission "", "";
};

 
archivoparaleer.txt - Archivo que leeremos o escribiremos con el cliente

Cacaaa

mucha cacaaaa

aún más cacaaaaaa


Vengaaa, archivillooooooo


¿Ya has terminado de aburrirte?

 

Ejecución del servidor

merlin1@merlins1:~/Escritorio/Practicas/11$ javac *.java   // compila todos los archivos .java
merlin1@merlins1:~/Escritorio/Practicas/11$ rmic ServidorFicherosImpl // Crea el Stub que recibirá las peticiones
merlin1@merlins1:~/Escritorio/Practicas/11$ rmiregistry & // Registra los servicios del servidor RMI
[1] 6589
merlin1@merlins1:~/Escritorio/Practicas/11$ java -Djava.security.policy=permisosServidor.txt ServidorFicherosImpl

Ejecución del cliente

merlin1@merlins1:~/Escritorio/Practicas/11$ java RMIlee archivoparaleer.txt localhost
Cacaaa

mucha cacaaaa

aún más cacaaaaaa


Vengaaa, archivillooooooo


¿Ya has terminado de aburrirte?
merlin1@merlins1:~/Escritorio/Practicas/11$

 

Resultados Pedidos:

Realizar otro cliente denominado RMImv que tome cuatro parámetros: el nombre del fichero a mover, la máquina orgien, el nombre que tendrá de destino y la máquina destino. Para ello hay que implementar un nuevo método remoto: delete, que en el servidor puede usar el método delete de un java.io.File local:

 

ServidorFicheros

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ServidorFicheros extends Remote {

   public byte[] read(String nombreFichero, int numBytes, long pos) 
      throws RemoteException;

   public void write(String nombreFichero, byte[] datos, long pos) 
      throws RemoteException;

   public void delete(String nombreFichero) 
      throws RemoteException;

}				        				        					 

 

ServidorFicherosImpl.java

import java.io.File;
import java.io.RandomAccessFile;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;

public class ServidorFicherosImpl 
   extends UnicastRemoteObject
   implements ServidorFicheros {

   public ServidorFicherosImpl() throws RemoteException {
      super();
   }

   public synchronized byte[] read(String nombreFichero, int numBytes, long pos) {
     try {
       RandomAccessFile f= new RandomAccessFile(nombreFichero, "r");
       f.seek(pos);
       int cuenta;
       byte[] buf=new byte[numBytes];
       cuenta= f.read(buf);
       f.close();
       if (cuenta < numBytes) {
          byte[]shortbuf=new byte[cuenta];
          System.arraycopy(buf, 0, shortbuf, 0, cuenta);
          return shortbuf;
       }
       else
          return buf;
     } 
     catch (Exception e) {
       System.err.println("Error '"
                           + e.getMessage() 
                           + "' ejecutando read sobre: "
                           + nombreFichero);
       return null;
     }
   }

   public synchronized void write(String nombreFichero, byte[] datos, long pos) {
     try {
       RandomAccessFile f= new RandomAccessFile(nombreFichero, "rw");
       f.seek(pos);
       f.write(datos);
       f.close();
       return;
     }
     catch (Exception e) {
       System.err.println("Error '"
                           + e.getMessage() 
                           + "' ejecutando write sobre: "
                           + nombreFichero);
       return;
     }
   }

    public synchronized void delete(String nombreFichero) {
     try {
       File f= new File(nombreFichero);
       f.delete();
       return;
     }
     catch (Exception e) {
       System.err.println("Error '"
                           + e.getMessage() 
                           + "' ejecutando delete sobre: "
                           + nombreFichero);
       return;
     }
   }

   public static void main(String argv[]) {
      if (System.getSecurityManager() == null) 
          System.setSecurityManager(new RMISecurityManager());
      try {
         ServidorFicheros fi = new ServidorFicherosImpl();
         Naming.rebind("//127.0.0.1/ServidorFicheros", fi);
      } 
      catch(Exception e) {
         System.out.println("ServidorFicheros: "+e.getMessage());
      }
   }
}				        				        					 

 

 RMIvm.java

import java.io.*; 
import java.rmi.*;

public class RMImv {

   public static void main(String argv[]) {
      if (argv.length != 4) {
	System.err.println("Uso: RMImv nombreFichero nombreMaquinaOrigen nombreFicheroDestino nombreMaquinaDestino");
	System.exit(1);
      }
      try {
         String nombreorigen = "//" + argv[1] + "/ServidorFicheros";
         ServidorFicheros fso = (ServidorFicheros) Naming.lookup(nombreorigen);
         String nombredestino = "//" + argv[3] + "/ServidorFicheros";
         ServidorFicheros fsd = (ServidorFicheros) Naming.lookup(nombredestino);
         byte[] datos;
         long pos = 0;
         do {
           datos=fso.read(argv[0],1024, pos);
           fsd.write(argv[2], datos, pos);
           pos+= 1024;
         } 
         while (datos.length == 1024);
	 fso.delete(argv[0]);
      } 
      catch (RemoteException e) { System.err.println("Excepcion remota: "+ e.getMessage()); }
      catch (Exception e) { System.err.println("Excepcion: "+ e.getMessage()); }
   }
}				        				        					 

 

Ejecución del servidor

merlin1@merlins1:~/Escritorio/Practicas/11$ javac *.java
merlin1@merlins1:~/Escritorio/Practicas/11$ rmic ServidorFicherosImpl
merlin1@merlins1:~/Escritorio/Practicas/11$ rmiregistry &
[1] 6589
merlin1@merlins1:~/Escritorio/Practicas/11$ java -Djava.security.policy=permisosServidor.txt ServidorFicherosImpl

Ejecución del cliente

merlin1@merlins1:~/Escritorio/Practicas/11$ ls Origen/
archivete.txt
merlin1@merlins1:~/Escritorio/Practicas/11$ ls Destino/
merlin1@merlins1:~/Escritorio/Practicas/11$ java RMImv Origen/archivete.txt localhost Destino/archivete.txt localhost
merlin1@merlins1:~/Escritorio/Practicas/11$ ls Origen/
merlin1@merlins1:~/Escritorio/Practicas/11$ ls Destino/
archivete.txt
merlin1@merlins1:~/Escritorio/Practicas/11$
cat Destino/archivete.txt
Archivete lleno de texto, para moverlo de un origen a un destino remotamente (...) archivo cortado manualmente.
merlin1@merlins1:~/Escritorio/Practicas/11$