AYUDA EN RMI, ENVIO DE IMAGENES

hespitia12
21 de Julio del 2004
HOLA:

Estoy haciendo un proyecto con rmi en el que necesito copiar una imagen de una computadora a otra.

Tengo las siguientes clases:

ESTA IMPLEMENTA LA INTERFAZ:

package rmi;
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.nio.channels.*;
import java.net.*;

public class ArticleImpl extends java.rmi.server.UnicastRemoteObject
implements ArticleInterface {


Vector vectFiles=null;


public ArticleImpl(String url_dir) throws java.rmi.RemoteException {

super();
vectFiles=new Vector();


// String url_dir="C:/WINDOWS/Escritorio/"+
// "Nueva/Images/";

File mainFile=new File(url_dir);

String [] mainF=mainFile.list();//Obtenemos los directorios del la ruta que nos pasan.

int index=mainF.length;

for(int i=0; i<index; i++){

File aux=new File(url_dir+mainF[i]);//Creamos objetos Files.

if(aux.isDirectory() && aux.list().length != 0){

for(int j=0; j <aux.list().length; j++){

vectFiles.addElement(new File(aux.getAbsolutePath()+"/"+aux.list()[j]));
}

}
}

}



public FileChannel getFChannel() throws java.rmi.RemoteException {
try{
if(!vectFiles.isEmpty()){
File file=(File)vectFiles.firstElement();
FileInputStream fis = new FileInputStream(file.getAbsolutePath());
return fis.getChannel();
//fis.close();
}
}catch(IOException ioe){
System.out.println(ioe.toString());
}
return null;
}
}





ESTA ES OTRA CLASE:


import gui.*;
import rmi.*;

import java.io.*;
import java.nio.channels.*;

import java.net.*;

public class CopiadorDeArchivos {




public static void copy(FileChannel sourceChannel, String nombreDestino) throws IOException {
FileOutputStream fos = new FileOutputStream(nombreDestino);
FileChannel canalDestino = fos.getChannel();
sourceChannel.transferTo(0, sourceChannel.size(), canalDestino);
fos.close();
}




Y UTILIZO LAS DOS CLASES ANTERIORES DE LA SIGUIENTE MANERA:

article es una instancia de la INterfaz que implemente en la primera clase:


CopiadorDeArchivos.copy(article.getFChannel(),
"C:/Documents and Settings/"+
"Administrador.IBM-D6XVX59ZYRD/Escritorio/arch.jpg");





PERO ME APARECE LA SIGUIENTE EXCEPCION:


java.rmi.UnmarshalException:error unmarshalling return; nested esception is: java.io.AbortedException: writing aborted; java.io.NotSerializableException:sun.nio.ch.FileChannelImpl

eldrum
21 de Julio del 2004
Es poco probable que la clase FileChannel sea serializable, y solo puedes enviar mediante RMI clases que sean serializables.

Si lo que quieres es copiar un archivo en otro desde la maquina remota, provablemente lo que tengas que hacer sera crear un metodo remoto que te permita dado un nombre, una longitud y un offset , obtener un array de bytes (que si son serializables) , y que el cliente tenga un metodo copiar que vaya llamando a ese metodo remoto y lo vaya copiando todo.

Repito para que quede mas claro:

!Solo puedes enviar mediante RMI clases que sean serializables¡