Desenvolvi uma aplicação utilizando RMI e fiz a conexão na porta 4262, até aí tudo bem. O problema e que o meu cliente funciona em um escritorio em outra cidade atraves de VPN e nás duas estremidades possui um firewall, quando conecto o cliente ao servidor tudo bem, foi so liberar a porta citada que funcionou, porem quando tento utilizar qualquer metodo remoto não funciona, aí o administrador da rede verificou que a aplicação estava solicitando outra porta alem da 4262. Foi só liberar esta nova porta que funcionou.
Gostaria de saber porque que a aplicação precisa de outra porta para funcionar, se a conexão é estabelecida na porta 4262. E é utilizada uma outra porta, como faço para definir esta porta em meu código, pois toda vez que paro o servidor para alguma atualização, esta porta muda e tenho que procurar o administrador da rede para analizar a rede e verificar qual a porta que a aplicação está requisitando para que esta possa ser liberada.
Vc consegue definir estas portas na hora de exportar os serviços RMI, em geral toda classe seua que é um serviço, implementa uma interface que extendeu de Remote e extends de UnicastRemoteObject, neste UnicastRemoteObject tem alguns construtores… e um deles é o que toma o numero da porta como parametro, só vc usar este.
R
renatofsouza
BLZ,
A porta 4262 está definida no construtor. Porem quando solicito algum método remoto e comunicação é feita em outra porta. Segue abaixo o codigo onde a porta é configurada.
O RMI utiliza uma porta somente para o RMI Registry, e uma para cada stub regitrado nele, a qual será a porta que o stub irá escutar. Se você criar o stub utilizando o método UnicastRemoteObject.exportObject(Remote objetoRemoto), este seu objetoRemoto irá escutar em uma porta anônima (aleatória), sendo assim vocÊ não irá saber que porta deve liberar no firewall. Agora, criando o stub utilizando o método UnicastRemoteObject.exportObject(Remote objetoRemoto,int porta), seu stub irá escutar na porta especificada, assim basta você liberar esta porta e a porta do RMI Registry no seu firewall. Vale lembrar que a porta que você especificar para o stub não pode ser 0 (zero), pois se for seu stab irá escutar em uma porta aleatória, ou seja UnicastRemoteObject.exportObject(Remote objetoRemoto) é igual a UnicastRemoteObject.exportObject(Remote objetoRemoto, 0).
A
andreymb
Esta porta que vocÊ passa no lookup é a porta do RMIRegistry, e não a porta em que seu serviço irá escutar
R
renatofsouza
Andrey,
Da forma que desenvolvi a aplicação usando Naming.rebind("",obj) ao invés de UnicastRemoteObject.exportObject(Remote objetoRemoto,int porta), é possivel setar a porta que o serviço irá escutar, ou tenho que mudar a aplicação. Estou tentando mudar más estou apanhando um pouco.
A
andreymb
A alteração que você tem que fazer é quando você cria o stub, antes de fazer o rebind. Você deve ter feito algo assim:
Onde InterfaceImpl é minha classe com os métodos implementados, esta classe herda os métodos de uma outra classe chamada InterfaceDeAcesso que está tanto no cliente como no servidor.
importjava.rmi.*;importjava.rmi.server.*;importjava.text.*;importjava.util.*;importjava.io.*;publicclassInterfaceImplextendsUnicastRemoteObjectimplementsInterfaceDeAcesso{Datedata=newDate();DateFormatformatoData=newSimpleDateFormat("dd/MM/yyyy");DateFormatformatoHora=DateFormat.getTimeInstance();DateFormatformatoDiaSemana=newSimpleDateFormat("EEEE");BancoDadosbase;publicInterfaceImpl()throwsRemoteException{base=newBancoDados();base.defineDriver("org.firebirdsql.jdbc.FBDriver");base.defineEndereco("jdbc:firebirdsql:192.168.18.4/3050:c:/Programas/ControleDeAutorizacoes.gdb");base.defineUsuario("SYSDBA");base.defineSenha("masterkey");}publicStringverificarusuario(Stringusuario,Stringsenha)throwsRemoteException{StringlocalAtendimento="";base.abreConexao();comandoSQL="SELECT localAtendimento FROM Usuario WHERE nome = '"+usuario+"' AND senha = '"+senha+"'";base.executaConsulta(comandoSQL);while(base.proximoRegistro())localAtendimento=base.retornaString("localAtendimento");base.fechaConexao();returnlocalAtendimento;}}
Este erro aconteceu porque você já tinha exportado um objeto com o nome “CONTROLEAUTORIZACAO”.
Tente reiniciar o RmiRegistry.
Para garantir que isto nao vai mais acontecer, use Naming.rebind em vez de Naming.bind
R
renatofsouza
Bom, agora funcionou, depois de uma boa surra.
O erros estavam acontecendo porque minha classe InterfaceImpl Herdava de UnicastRemoteObject, e quando tentava exportar o objeto com o comando que você me passou dava aquele erro, foi só tirar a herança que tudo funcionou. Já fiz o teste no escritório na outra cidade. Agora não terei mais problemas com as portas.