Eu tenho 1 aplicação onde quando eu subo o servidor e abro o cliente aki em casa… o callback funciona perfeitamente, porem quando mandei o .jar para um amigo , la quando chegou na 1º linha de codigo onde o se usava callback simplismente n prosseguiu, n deu excerção… nada, apenas travou. Alguem sabe pq?
Firewall? porta protegida? incompatibilidade?
ninguem sabe qual eh o problema?
Kra da uma lida nesse camarada aqui, pois se funciona com vc e nao funciona com outras pessoas mas nao todas… isso pode ser sim Firewall
ve se isso ajuda !
http://java.sun.com/developer/onlineTraining/rmi/RMI.html#RMIClientSideCallbacks
ou
http://www.dca.fee.unicamp.br/cursos/PooJava/objdist/rmicallback.html
Se for uma máquina linux, tente colocar no /etc/hosts a seguinte linha:
127.0.0.1 localhost
Main //Programa CLiente
O mesmo cliente q envio pro servidor eh esse ClienteImpl q crio na inicialização do programa Cliente.
import java.rmi.RemoteException;
import Cliente.ClienteImpl;
import Entrada.ControladoriEntrada;
import Beans.*;
public class AplicWars {
public static void main(String args[]) throws RemoteException{
ClienteImpl cliente = new ClienteImpl();
Player player = new Player();
Entrada.ControladoriEntrada iEntrada = new ControladoriEntrada(cliente, player);
iEntrada.setVisible(true);
}
}
Objeto Login //Programa Cliente
login.setLogin(getLogin());
login.setSenha(getSenha());
login.setCliente(getCliente());
loginstatus = getCliente().Envia(login);
Chamando metodo no servidor; //PRograma Servidor
public static boolean login(Login login) {
boolean resposta=false;
try {
Connection con = ConnectionFactory.getConnection();
PreparedStatement verifica = con.prepareStatement("SELECT * FROM PLAYERS where LOGIN =?");
verifica.setString(1,login.getLogin());
ResultSet resultado = verifica.executeQuery();
while (resultado.next()){
if(login.getSenha().equals(resultado.getString("senha"))){
resposta=true;
}
}
if (resposta){
Player player = new Player();
player.setNick(getNick(login));
player.setPartidas(getPartidas(login));
player.setVitorias(getVitorias(login));
player.setPatente(getPatente(login));
player.setBookEntry(getBookEntry(player.getPatente(), player.getNick()));
[b]Cliente cli = login.getCliente();
cli.setPlayer(player);[/b]
Registrar(cli);
System.out.print("Cliente entrou nick:" + cli.getPlayer().getNick() + "\n");
}
} catch (SQLException e){
e.getStackTrace();
}catch (RemoteException e){
e.getStackTrace();
}catch (Exception e){
e.getStackTrace();
}
return resposta;
}
Cliente.java //Nos 2 programas
package Cliente;
import java.rmi.Remote;
import java.rmi.RemoteException;
import javax.swing.JTextPane;
import javax.swing.text.SimpleAttributeSet;
import Beans.*;
import BookEntry.BookEntry;
public interface Cliente extends Remote{
public Player player = null;
public void setPlayer(Player player)throws RemoteException;
public Player getPlayer()throws RemoteException;
public void addChatNick(BookEntry patente)throws RemoteException;
public void removeChatNick(int i)throws RemoteException;
public void setPlayersOn(int playerson)throws RemoteException;
public void EnviaMsg(String palavra, SimpleAttributeSet set)throws RemoteException;
public boolean Recebe(PlayersInfo info) throws RemoteException;
}
clienteImpl.java //Programa CLiente
[code]
package Cliente;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.ServerNotActiveException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.AlreadyBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
import javax.swing.*;
import javax.swing.text.SimpleAttributeSet;
import Beans.;
import BeansImpl.;
import BookEntry.BookEntry;
import Chat.iChat;
import Servidor.*;
public class ClienteImpl extends UnicastRemoteObject implements Cliente {
Registry registry;
Servidor stub;
boolean status;
Player player;
public ClienteImpl() throws RemoteException{
status = false;
}
public boolean runConexao(){
try{
registry = LocateRegistry.getRegistry("189.10.27.125", 7502);
stub = (Servidor) registry.lookup ("wars");
status = true;
}catch(RemoteException Re){
JOptionPane.showMessageDialog(null,Re.getMessage(),"ERROR!!",0);
System.out.print(Re.getMessage());
}catch(NotBoundException NBe){
JOptionPane.showMessageDialog(null,NBe.getMessage(),"ERROR!!",0);
}
return status;
}
public boolean Envia(Login login){
boolean status = false;
try{
status = stub.Recebe(login);
}catch (RemoteException e){
e.printStackTrace();
}
return status;
}
public boolean Envia(Cadastrar cadastrar){
boolean status = false;
try{
status = stub.Recebe(cadastrar);
}catch (RemoteException e){
e.printStackTrace();
}
return status;
}
public boolean Envia(Chat chat){
boolean status = false;
try{
status = stub.Recebe(chat);
}catch (RemoteException e){
e.printStackTrace();
}
return status;
}
public boolean Envia(Logout logout){
boolean status = false;
try{
status = stub.Recebe(logout);
}catch (RemoteException e){
e.printStackTrace();
}
return status;
}
public boolean Envia(PlayersInfo info){
boolean status = false;
try{
status = stub.Recebe(info);
}catch (RemoteException e){
e.printStackTrace();
}
return status;
}
public boolean Recebe(PlayersInfo info){
boolean status = false;
try{
status = PlayersInfoImpl.addRank(info);
}catch (Exception e){
e.printStackTrace();
}
return status;
}
public void addChatNick(BookEntry patente) {
iChat.addChatNick(patente);
}
public void removeChatNick(int i) {
iChat.removeChatNick(i);
}
public void setPlayersOn(int playerson) {
iChat.setPlayersOn(playerson);
}
public void EnviaMsg(String palavra, SimpleAttributeSet set) {
iChat.EnviaMsg(palavra, set);
}
public void setPlayer(Player player) {
this.player = player;
}
public Player getPlayer() {
return player;
}
}[/code]
Meu codigo ta igual esses links q vc postou ae, e estou fazendo no windows, porem n sei pq quando o programa esta rodando com outras pessoas n funciona!
So o callback q n esta funcionando =[!
Cara, eu no meu codigo eu n faço referencia nenhuma ao os hosts dos clientes, eu ja havia pensado q este poderia ser o problema, eu tenho ate 1 metodo q eu consigo o host dos clientes, mais meu problema eh como fazer essa referencia?
O servidor ta recebendo pacotes pq na hora q eu fiz o getRegistry passei o host do servidor, mais fiz desse jeito pois foi os exemplos q eu li q estava desse jeito, exemplos da sun.
Vc sabe o q tenho q fazer para fazer referencias dos hosts com seus respectivos clientes?
Uso jdk 5.0
Não é isto. Existe um “bug” em RMI que faz com que o server ao inves de mandar como endereço de retorno dos seus pacotes o seu endereço, mande o endereço de loopback (localhost).
Para resolver o problema, set a property java.rmi.server.hostname com o endereço IP do seu server no seu server.
N entendi muito esse bug n… tem algum link (portugues) q fala sobre ele?
Pq se ele n envia seu proprio endereço, o erro n seria comunicação cliente/servdior inves de callback? Mais pelo link q vc me passou me parece q tb afeta o callback. Se tiver algum artigo ae q fala sobre isso agradeceria, vo tentar ler sobre isso tb vlw!!
Eh assim q seta o hostname? No servidorimpl?
void setHostName() {
Properties systemProperties =
new Properties( System.getProperties() );
systemProperties.put("java.rmi.server.hostname","189.10.27.125");
System.setProperties(systemProperties);
}
Tente o Google.
[quote=phiny]
Pq se ele n envia seu proprio endereço, o erro n seria comunicação cliente/servdior inves de callback? Mais pelo link q vc me passou me parece q tb afeta o callback. Se tiver algum artigo ae q fala sobre isso agradeceria, vo tentar ler sobre isso tb vlw!![/quote]
Se voce ainda está com duvida do problema, tente fazer um logging do RMI
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/logging.html e um dump da rede.
Set a property na propria JVM passando -Djava.rmi.server.hostname=189.10.27.125 como parametro do java.
É bem mais facil…
[quote=phiny]Eh assim q seta o hostname? No servidorimpl?
void setHostName() {
Properties systemProperties =
new Properties( System.getProperties() );
systemProperties.put("java.rmi.server.hostname","189.10.27.125");
System.setProperties(systemProperties);
}
[/quote]
Desculpe me minha ignorancia, como faz para fazer isso?
No prompt eh facil fazer, mais como faz pra sertar isso no eclipse?
Na boa (crítica construtiva), veja o help do Eclipse.
Não use este forum como “muleta”.
Vlw pela tentativa mais o hostname n resolveu meu problema =[!