Socket Para Listar Arquivos

Desenvolva um programa em Java seguindo o modelo Cliente-Servidor e usando Sockets que
funcione da seguinte forma: o cliente envia comandos solicitando serviços do Servidor e o
Servidor responde adequadamente. Os comandos abaixo devem ser implementados.
a) ListaDir: servidor devolve lista de arquivos e subdiretórios do diretório padrão do usuário
na máquina servidora. Por exemplo, no Linux, o usuário ruy, deveria listar o conteúdo do
diretório /home/ruy;
b) ListaUsuarios: servidor devolve nomes do usuários que estão logados no servidor. Se não
houver nenhum usuário logado, devolve a mensagem: ?ninguém está logado no
momento?;

Eu fiz aqui os codigos mas esta dando um erro na parte cliente e nao esou conseguindo solucionar tem como alguém me ajudar,
por gentileza. =)

INTERFACE

import java.io.File;
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface IFServidor extends Remote {
        public File[] listarArquivos() throws RemoteException;
        public byte[] getDownload(String arquivo) throws RemoteException;
}

CLIENTE

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public final class Cliente {

        private static String dir = "C:" + File.separator
                        + "ArquivosCompartilhados";

        public Cliente() {
                inicia();
        }

        public void inicia() {
                String entrada;
                String arquivo;
                BufferedReader teclado = new BufferedReader(new InputStreamReader(
                                System.in));

                try {
                        Registry registry = LocateRegistry.getRegistry("localhost", 1000);
                        IFServidor stub = (IFServidor) registry.lookup("Servidor");
                        System.out.println("Para listar os arquivos nesse diretório, entre com 'Listar'");
                        System.out.println("Para fazer download de um dos arquivos nesse diretório, entre com 'Download'");
                        System.out.println("Para sair, pressione a tecla 'Enter'");
                        System.out.println("Opção: ");
                        entrada = teclado.readLine();
                        while (!entrada.equals("")) {
                                if (entrada.equalsIgnoreCase("listar")) {
                                        requestListagem(stub);
                                } else {
                                        if (entrada.equalsIgnoreCase("download")) {
                                                System.out.println("Digite o nome do arquivo: ");
                                                arquivo = teclado.readLine();
                                                requestDownload(stub, arquivo);
                                        }
                                }
                                System.out.println("Entrada>> ");
                                entrada = teclado.readLine();
                        }
                        System.out.println("Sistema fechado.");
                } catch (RemoteException Re) {
                        Re.printStackTrace();
                } catch (NotBoundException NBe) {
                        NBe.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

        private static void requestDownload(IFServidor stub, String arquivo)
                        throws RemoteException, FileNotFoundException, IOException {
                File diretorio = new File(dir);
                diretorio.mkdir();
                byte[] data = stub.getDownload(arquivo);
                if(data!=null){
                        FileOutputStream saida = new FileOutputStream(dir+File.separator+arquivo);
                        saida.write(data);
                        saida.close();
                }else{
                        System.out.println("Arquivo solicitado nao existe.");
                }
        }

        private static void requestListagem(IFServidor stub) throws RemoteException {
                File[] listaArquivos = stub.listarArquivos();
                if (listaArquivos == null) {
                        System.out.println("Lista de arquivos vazia.");
                } else {
                        for (int i = 0; i < listaArquivos.length; i++) {
                                System.out.println(listaArquivos[i].getName());
                        }
                        System.out.println("");
                }
        }

        public static void main(String[] args) {
                new Cliente();
        }
}

SERVIDOR

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public final class Servidor implements InterfaceServidor {

        private static String dir = "C:" + File.separator + "Windows"; //indica o diretorio

        public Servidor() {
                inicia();
        }

        public void inicia() {
                try {
                        File diretorio = new File(dir);
                        diretorio.mkdir();
                        // Exporta o objeto remoto
                        InterfaceServidor stub = (InterfaceServidor) UnicastRemoteObject.exportObject(this, 0);

                        // Liga o stub do objeto remoto no registro, e inicia o RMIRegistry
                        // na porta 1000
                        Registry registry = LocateRegistry.createRegistry(1000);

                        // De um nome pra ele no registro
                        registry.bind("Servidor", stub);

                        System.out.println("Servidor iniciado...");
                } catch (RemoteException ex) {
                        System.out.println(ex.getMessage());
                } catch (AlreadyBoundException ex) {
                        System.out.println(ex.getMessage());
                }catch (Throwable t){
                        t.printStackTrace();
                }
        }
 
        public File[] listarArquivos() {
                File diretorio = new File(dir);
                if(diretorio.listFiles().length>0){
                        System.out.println("Dentro da lista de arquivos!");
                        return diretorio.listFiles();
                }else{
                        return null;
                }
        }
        
        public byte[] getDownload(String arquivo) {
                try{
                        // Carrega o arquivo
                        FileInputStream in = new FileInputStream(dir+File.separator+arquivo);
                        // Carrega dados e informacoes do arquivo
                        FileChannel fc = in.getChannel();
                        // inicia array de bytes de tamanho igual ao do arquivo a enviar
                        byte[] data = new byte[(int) fc.size()];
                        ByteBuffer bb = ByteBuffer.wrap(data);
                        // insere conteudo do arquivo no vetor de bytes
                        fc.read(bb);
                        System.out.println("Quantidade de bytes: "+data.length);
                        return data;
                }catch (FileNotFoundException e) {
                        return null;
                }catch (IOException e) {
                        return null;
                }
        }
                
        public static void main(String args[]) {
                new Servidor().listarArquivos();
        }
}

Qual o erro?

run:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: InterfaceServidor (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Cliente.inicia(Cliente.java:29)
at Cliente.(Cliente.java:18)
at Cliente.main(Cliente.java:85)
Caused by: java.lang.ClassNotFoundException: InterfaceServidor (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
… 4 more

O que existe nesta linha?
Cliente.inicia(Cliente.java:29)

Vamos ver se eu consigo explicar =)
como vc ja viu esse codigo e em RMI
na hora de compilar via linha de comando da um erro na parte do cliente
=/