Callback

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 =[!

O problema seria este?

http://java.sun.com/j2se/1.4.2/docs/guide/rmi/faq.html#netunknownhost

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?

http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html#options

Procure por -D nesta seção.

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 =[!