Alguém sabe como posso abrir arquivos remotamente?
Como assim remotamente?
você tem acesso ao compartilhamento de outra máquina?
new File("\\maquina\caminho\arquivo");
precisamos de mais informações para ajudar.
Eu queria abrir um arquivo em outra máquina.
Vou ter uma aplicação rodando no pc1 e esta aplicação vai abrir um arquivo no pc2
Em java, as restrições para leitura de arquivos são quase iguais as do sistemas operacional.
Como você acessária esse arquivo sem o java (FTP, SVN, …)?
Eu acesso via socket.
Nesse caso não, a solução é construir uma aplicação na arquitetura client/server.
Cuidado somente para não reinventar a roda, se possível use RMI no lugar de Sockets.
Aqui no site já tem algumas informações a respeito na parte de artigos/tutoriais.
O RMI acessa pcs que não estão na mesma rede?
RMI só é um camada de abstração adicionada a sockets.
Se lembre é claro que tem que ter liberação das portas que você vai utilizar no firewall.
A liberação eu tenho.
E o rmi não é só para invocar métodos remotos?
Vou explicar melhor a minha dúvida, porque acho que não ficou muito clara.
Eu tenho uma apicação que roda no PC1 e esta aplicação precisa acessar um arquivo que se econtra em um PC2 em uma outra rede e para acessar este arquivo vou usar o protocolo HTTP, depois de acessar este arquivo eu preciso escrever no mesmo.
Amigo,
Como foi dito acima, o RMI é uma abstração de Sockets. É pra simplificar o trabalho. Por exemplo, em Sockets, vc precisa criar um monte de código pra poder obter acesso, tem que ficar controlando a conversa com o servidor, etc… O RMI, vai fazer tudo isso automaticamente, No cliente você só precisa utilizar um objeto para passar o endereço onde você quer conectar e enviar ou receber as informações que você quiser, como se fosse um método de sua própria classe.
No servidor, você define o nome dele para o cliente poder acessar e usa uma Interface para mostrar ao cliente os métodos que ele pode utilizar.
Procura aqui no fórum que tem um monte de tópico explicando como o RMI funciona e vai te ajudar muito…sério mesmo, vai ser difícil vc querer usar sockets depois que aprender RMI.
Em RMI:
Se você quiser que o seu cliente leia o conteúdo desse arquivo remoto, é só chamar um método e o Servidor retorna uma String (ou qqr outra coisa que vc quiser) para o cliente, com o conteúdo do arquivo.
Se quiser escrever, o Cliente envia para o Servidor a String que deve ser inserida no fim do arquivo.
Com sockets, eu iria montar uma string iniciando com uma variável flag, que indicaria ao servidor se eu gostaria de ler ou escrever no arquivo ( o Servidor leria essa String com o método StringTokenizer para eu poder separar o flag do resto da mensagem).
Espero ter ajudado…
Com RMI eu teria que ter uma aplicação no servidor e e uma aplicação no cliente?
Isso meu amigo… Mas vc teria um em cada PC mesmo usando Sockets.
Você tem que criar uma aplicação que será o Servidor e uma que será o Cliente. Cada uma vai ficar em um PC diferente. Aí, você utiliza seu cliente para fazer acesso ao servidor e consequentemente, fazer todo o resto que vc quiser.
Se vc quiser, me mande um e-mail: herick.marques@gmail.com e eu te envio um exemplo de RMI que eu fiz. Acredito que com base nele vc vai descobrir como funciona.
Se você está falando que é http posso entender que na maquina que está o arquivo (PC2) você terá um httpServer.
Nesse caso você não precisa de RMI ou socket é só fazer um download do arquivo alterar e depois fazer um upload.
Dê uma olhada em HttpClient da Apache.
[quote=“Hericksnake”]
Se vc quiser, me mande um e-mail: herick.marques@gmail.com e eu te envio um exemplo de RMI que eu fiz. Acredito que com base nele vc vai descobrir como funciona.[/quote]
Hericksnake, não manda por e-mail não…
Põe o exemplo no fórum para futuras consultas de outros usuários…
Abraço…
OK…Atendendo a pedidos…rsrsrs…
Vou colocar aqui em baixo, um tutorialzinho pra rodar a aplicação, configuração, etc… E abaixo, coloco os códigos da aplicação exemplo ok?
Vamos lá então:
Lembrando que se alguém quiser alterar qqr coisa sinta-se à vontade ok?
Primeiramente tenha certeza de estar com o classpath devidamente configurado, aceitando os comandos “javac”, “rmiregistry”, etc…
Executando um exemplo de JAVA RMI:
Rodando localmente faça:
De posse dos arquivos “Servidor.java”, “Cliente.java” e “InterfaceServidor.java”, faça o seguinte:
Crie uma pasta qualquer e insira estes arquivos nela.
Pelo prompt, vá até o diretório que você acabou de criar (onde estão contidos os 3 arquivos), e execute o comando: “javac *.java”.
A compilação dos 3 arquivos deve ser executada. “Se tudo deu certo, foram criados no diretório 3 novos arquivos com a extensão “.class” que são os resultados da compilação dos arquivos “.java”.
Após compilados, ainda no prompt, execute o comando “rmic Servidor”, este comando vai gerar o arquivo “Servidor_Stub.class”. Esse arquivo o servidor rmi do java reconhece para fazer a publicação do serviço.
Agora execute o comando “start rmiregistry” vai abrir um novo prompt sem nada escrito, é o servidor do rmi ativo.
Agora só falta executar o arquivo do Servidor para liberar o acesso remoto ao Cliente.
No prompt e no diretório respectivo digite “java Servidor” este deverá mandar como resposta a mensagem “conexão efetuada” e vai esperar pelas requisições do cliente.
Para executar o Cliente vá no prompt e no respectivo diretório digite o comando “java Cliente”. O Cliente vai executar e esperar o usuário entrar com os dados para fazer a invocação do Servidor.
Rodando remotamente faça:
O local remoto onde o cliente vai ser executado deve estar com os arquivos “Cliente.class”, “InterfaceServidor.class” e “Servidor_Stub.class” além de saber o IP da máquina onde o servidor está executando.
Você deve executar o comando “start rmiregistry” e em seguida “java Cliente”.
Bom, o programinha que eu vou postar aqui, é um trabalhinho que fiz pra faculdade, um Servidor de nomes onde vc utiliza o método BIND do servidor para que o Cliente envie um nome e um objeto, e o método LOOKUP que é o método onde um segundo cliente vai no servidor consultar se existe um objeto com o determinado nome.
Nesse caso, são duas classes clientes diferentes, uma que insere e uma que consulta, portanto, no tutorial que eu coloquei acima, é só adequar o nome das classes nos comando para a execução.
Código da Inetrface:
[code]import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Interface extends Remote{
public void Bind(String palavra, Object objeto) throws RemoteException;
public Object lookup(String palavra) throws RemoteException;
}
[/code]
Código do Servidor:
[code]import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Servidor extends UnicastRemoteObject implements Interface {
//Cria dois vetores com tamanho pré definido de 50 para armazenar o objeto e a palavra.
public String[] palavra = new String [50];
public Object[] objetos = new Object[50];
//Contador responsável por manter a correta inserção dos objetos e palvaras nos vetores acima
int contador=0;
protected Servidor() throws RemoteException {
super();
}
public static void main(String[] args){
try {
//Objeto da interface mostrando que toda ação no servidor só será possível através da interface.
Interface inter = new Servidor();
//Inicialização do servidor. "ServidorPalavras" é o nome que diferencia ele na rede.
//Ao invés de se utilizar portas de conexão se utiliza o nome do Servidor
// "Inter" varíavel da interface necessário pra fazer o bind do servidor.
Naming.rebind("ServidorPalavras", (Remote) inter);
System.out.println("Servidor online - aguardando acessos....");
} catch (Exception e) {
System.err.println("Server error: "+e.getMessage());
}
}
private static final long serialVersionUID = 1L;
public Object lookup(String palavra) {
// TODO Auto-generated method stub
//Pega o tamanho dos vetores, pra poder percorrer pelos seus valores
int tam = this.palavra.length;
//Anda pelo vetor
for(int i=0; i<tam; i++){
//Se o nome encontrado no Vetor de palavras for igual a palavra consultada:
if(this.palavra[i].equals(palavra)){
//Retorno o objeto do vetor de objetos.
return objetos[i];
}
}
//Se não acha nada retorna null
return null;
}
public void Bind(String palavra, Object objeto) {
// TODO Auto-generated method stub
//Pega o nome e o objeto e insere nos respectivos Arrays lists
System.out.println("Palavra: "+palavra+ " inserida no servidor.");
this.palavra[contador]=palavra;
this.objetos[contador]=objeto;
System.out.println("Inserido na posicao: "+contador+" dos vetores de nome e objeto");
contador++;
}
}
[/code]
Código do cliente que insere o objeto no servidor:
[code]import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.rmi.Naming;
import javax.swing.JOptionPane;
//Classe site que vai ter os objetos inseridos no servidor.
class Site implements Serializable{
private static final long serialVersionUID = 1L;
public String nome;
public String endIP;
}
//Classe responsável pela inserção dos objetos no servidor
public class ClienteInsere {
public static void main(String[] args) {
// TODO Auto-generated method stub
String IP;
//Abrir leitura do teclado.
try {
//Cria um buffer para leitura
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Digite o IP: ");
IP = reader.readLine(); //recebe entrada do usuário
//chama o método(função) que faz a conexão remota
ClienteInsere cli = new ClienteInsere();
//Cria objetos do tipo Site que serão armazenados no servidor
Site a = new Site();
a.nome="www.uol.com.br";
a.endIP="200.221.2.45";
cli.EnviaObjeto(IP,"Uol", a);
Site b = new Site();
b.nome="www.terra.com.br";
b.endIP="200.176.3.142";
cli.EnviaObjeto(IP,"Terra", b);
Site c = new Site();
c.nome="www.ig.com.br";
c.endIP="200.226.133.74";
cli.EnviaObjeto(IP,"IG", c);
Site d = new Site();
d.nome="www.inf.pucpcaldas.br";
d.endIP="200.226.229.240";
cli.EnviaObjeto(IP,"Inf", d);
}
catch (IOException e) {
System.out.println("Erro: "+ e.getMessage());
}
}
public void EnviaObjeto(String IP, String nome, Object obj){
//URL do Servidor com um IP local
String url= "rmi://"+IP+"/";
try{
//Cria objeto da interface que permite o acesso remoto ao servidor, passando o IP e o nome do mesmo
Interface envia = (Interface)Naming.lookup(url+"ServidorPalavras");
//Faz o envio do nome e do objeto para o servidor
envia.Bind(nome, obj);
System.out.println("Objeto inserido");
} catch (Exception e) {
//Em caso de erro mostra o que aconteceu.
JOptionPane.showMessageDialog(null,"Erro: "+e.getMessage());
}
}
}
[/code]
Código do cliente que consulta o nome no servidor:
[code]import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.Naming;
public class ConsultaCliente {
public static void main(String[] args) {
// TODO Auto-generated method stub
String IP;
//Abrir leitura do teclado.
try {
//Cria um buffer para leitura
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Digite o IP: ");
IP = reader.readLine(); //recebe entrada do usuário
//chama o método(função) que faz a conexão remota
ConsultaCliente cons = new ConsultaCliente();
cons.Consulta(IP,"Uol");
cons.Consulta(IP,"Terra");
cons.Consulta(IP,"Inf");
cons.Consulta(IP,"Bol");// Não tem no servidor, mas é para mostrar a mensagem de erro
cons.Consulta(IP,"IG");
}
catch (IOException e) {
System.out.println("Erro: "+ e.getMessage());
}
}
//Método que conecta e consulta no servidor
public void Consulta(String IP, String palavra){
//Objeto que retorna do servidor
Object ret;
// URL do servidor
String url= "rmi://"+IP+"/";
try{
//Utiliza a interface para acessar os métodos do servidor
//É passado a URL e o nome do servidor. Nome esse que diferencia ele de outros que possam existir
// no mesmo endereço
Interface envia = (Interface)Naming.lookup(url+"ServidorPalavras");
//Faz a consulta passando o nome e retornando um objeto
ret=envia.lookup(palavra);
//Se o objeto retornado for null, nada foi encontrado, caso contrário mostra o que foi retornado
if(ret!=null){
System.out.println("Encontrou");
//Tenta converter o objeto retornado para um objeto do tipo SIte
//Se o objeto for do tipo SIte, imprime os valores dele.
Site site = (Site)ret;
//Imprime os dados do objeto retornado do servidor.
System.out.println("Nome: "+ site.nome);
System.out.println("IP: "+site.endIP);
}else
System.out.println("Palavra não encontrada.");
System.out.println("Conexão finalizada.\n");
} catch (Exception e) {
System.out.println("Palavra:" +palavra+" - não encontrada.\n");
}
}
}
[/code]
Espero ter ajudado de alguma forma. No caso do amigo que quer ler e escrever no arquivo, você vai ter que criar métodos na Interface e implementá-los no servidor, fazendo a parte de abertura de arquivo, busca, etc…
Abraço!