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();
}
}