XML-RPC aplicaçoes distribuidas com java HELP!

Ola Pessoal.
Ja li vários posts mas ainda nao consegui ver realmente uma solução…
ja vi como transformar um objeto em xml e talz…
mas ainda nao sei o que fazer.

CHAT !
Um servidor e varios clientes.
No cliente eu tenho um servidor xml-rpc tambem!.

meu cliente (através de uma interface) chama meu servidor para se conectar…
e por este método envia como parametro o ip e a porta do servidor instanciado no cliente.

A implementação da interface no servidor, armazena meu cliente, instancia um xml-rpc client referenciando o servidor xml que esta no meu cliente…
desta forma o meu servidor… chama os clientes por meio de uma interface implementada no cliente.

quando um cliente se conectar ao chat… quero enviar atravez do método da interface um objeto do tipo VJogador
que contem alguns dados.

Como se fosse em RMI que meu VJogador implementaria serializable… e eu so passaria o objeto na chamada do método.

Como escrevo o codigo… para fazer com que o meu VJogador seja um tipo serializavel em xml… e eu apenas chamar ?

OBS: estou usando a implementação do xml-rpc da apache.

classes:

[code]package negocio.estrutura;

import java.io.Serializable;

public class VJogador implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -1967302606662877177L;
private String nickName;
private Integer pontos;
private String insignia;
private Integer ranking;


public String getNickName() {
	return nickName;
}
public void setNickName(String nickName) {
	this.nickName = nickName;
}
public Integer getPontos() {
	return pontos;
}
public void setPontos(Integer pontos) {
	this.pontos = pontos;
}
public Integer getRanking() {
	return ranking;
}
public void setRanking(Integer ranking) {
	this.ranking = ranking;
}
public String getInsignia() {
	return insignia;
}
public void setInsignia(String insignia) {
	this.insignia = insignia;
}

}
[/code]

o VJogador ja está implementando serializable… pq uso o mesmo objeto para comunicação RMI.

public interface IChatGUIXml extends IChatGUI{
	/** Atualizar a lista de Chat */
	public String alguemFalou(String quem, String fala);
	
	/** Atualizar os jogadores conectados */
	public String alguemEntrou(VJogador jogador);
public class ChatGUIXml implements IChatGUIXml{

	@Override
	public String alguemEntrou(VJogador jogador) {
		FrameChat fc = (FrameChat) RepositorioFrames.getRepositorio().getFrame("Chat");
		fc.alguemEntrou(jogador);
		return "";
	}

	@Override
	public String alguemFalou(String quem, String fala) {
		FrameChat fc = (FrameChat) RepositorioFrames.getRepositorio().getFrame("Chat");
		fc.alguemFalou(quem, fala);	
		return "";
	}

FrameChat implementa IChatGUIXml
entao… quando o servidor chama o listener…
a minha tela de chat é atualizada…

aki em baixo é onde o servidor chama a interface listener de cada cliente
as interfaces sao obtidas a partir do xmlClientServer…

a baixo a implementaçao da chamada que o cliente faz para se conectar ao chat.

[code]
public String connect(String servidor, String jogador, String ip, int porta) throws MalformedURLException {
Servidor s = (Servidor) ObjectProxy.getObjectProxy().resgataObjeto(servidor);

	XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
	config.setEnabledForExceptions(true);
	config.setEnabledForExtensions(true);
	config.setServerURL(new URL("http://"+ip+":"+porta+"/"));
	
	XmlRpcClient servidorCliente = new XmlRpcClient();
	servidorCliente.setConfig(config);
	
	ClientFactory cf = new ClientFactory(servidorCliente);
    IChatGUIXml chatListenerXml  = (IChatGUIXml) cf.newInstance(IChatGUIXml.class);
    String chat = s.connectXML(jogador, chatListenerXml);
    
    return chat;
}[/code]
IChatGUIXml listenerXml = (IChatGUIXml) listener;
				for(Jogador j:jogadoresConectados) {
					System.out.println("um cara conectado" +j.getNickname());
					VJogador vjogador = new VJogador();
					//TODO
					vjogador.setInsignia("SOLDADO");
					vjogador.setNickName(j.getNickname());
					vjogador.setPontos(j.getPontos());
					listenerXml.alguemEntrou(vjogador);
				}

listenerXml.alguemEntrou(vjogador);

resumindo… preciso que essa chamada via xmlrpc
aceite o meu vjogador como se fosse serializavel
help plz

Alguem ?
Help

Alguem ?
realmente estou precisando resolver isto

Nada ?
Se um mod puder zerar minhas respostas aki…
pra que o topico volte a ter 0 respostas…
pq deve ser isso…
desde o dia 02
e nada.

preciso desta ajuda…

Ninguem ! ?

O terror! O que vc tá querendo fazer é um chat?

É trabalho para faculdade?

O que tá rolando?

flws

E bem vindo ao forum!

é
isso ae
é trabalho de faculdade e eu vou usar a implementaçao para por no ar.
isso faz parte de um jogo
ja implementado em outra linguagem que eu estou reescrevendo em java.

Como trabalho de faculdade
tenho que fazer a comunicação de duas linguagens diferentes usando XML-RPC
até ai muito simples…
como eu sou meio chato e gosto de aprender realmente as coisas… e buscar…
Seria muito facil fazer a chamada do método passando varios argumentos…
que no caso iriam compor o objeto…

mas…
eu quero enviar o objeto todo na chamada do método…
como em rmi
que o objeto eh serializavel.

o objeto para passar por xml-rpc
teria q ser algo como xml-rpc seralizable…
ou implementar uns métodos no meu objeto…
que iriam compor o xml na hora de ser transportado…
mas nao tenho ideia de como fazer…

tou realmente precisando dessa solução.

Duas perguntas:

  1. Você já leu isto daqui http://ws.apache.org/xmlrpc/xmlrpc2/types.html, sobre restrições de tipos de dados do xml-rpc?

  2. Você é obrigado a utilizar o xml-rpc?

flws

Perguntas
1)
sim eu ja li.
mas tbm ha um tipo… estrutura que pode ser trafegado em xml-rpc
java.util.Hashtable java.util.Hashtable
e tem tambem isso

ou eu crio meu objeto sendo um tipo de estrutura
que n tenho ideia alguma de como fazer…

ou meu objeto implementa algo como XmlSerializer

package negocio.estrutura;

import java.io.Serializable;

import com.sun.xml.internal.txw2.output.XmlSerializer;

public class VJogador implements Serializable, XmlSerializer{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -1967302606662877177L;
	private String nickName;
	private Integer pontos;
	private String insignia;
	private Integer ranking;
	
	
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public Integer getPontos() {
		return pontos;
	}
	public void setPontos(Integer pontos) {
		this.pontos = pontos;
	}
	public Integer getRanking() {
		return ranking;
	}
	public void setRanking(Integer ranking) {
		this.ranking = ranking;
	}
	public String getInsignia() {
		return insignia;
	}
	public void setInsignia(String insignia) {
		this.insignia = insignia;
	}
	@Override
	public void beginStartTag(String arg0, String arg1, String arg2) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void cdata(StringBuilder arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void comment(StringBuilder arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void endDocument() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void endStartTag(String arg0, String arg1, String arg2) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void endTag() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void flush() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void startDocument() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void text(StringBuilder arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void writeAttribute(String arg0, String arg1, String arg2,
			StringBuilder arg3) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void writeXmlns(String arg0, String arg1) {
		// TODO Auto-generated method stub
		
	}
	
}

que tem esse bando de métodos ai pra criar o xml…
que eu n sei como usar…

ou entao algum outro XmlRpcHanlder
ou writer
ou algo assim

preciso de uma orientação…

sim… para o trabalho
e como alternativa ao rmi
caso haja problemas na implementação pela internet
quando o servidor estiver no ar.

recomendo usar o stax, um dos mais rápido que já vi, agora para quebrar seu galho e resolver bem rápido vc pode usar o xstream

ta…
essas sao api´s que auxiliam a manipulaçao de objetos em xml…
mas cmo eu vo enviar pela chamada remota…
usando xml-rpc
vo enviar o xml na chamada do método ?

[quote=Fernando H. Gomes]ta…
essas sao api´s que auxiliam a manipulaçao de objetos em xml…
mas cmo eu vo enviar pela chamada remota…
usando xml-rpc
vo enviar o xml na chamada do método ? [/quote]

A idéia do faelcavalcanti parece que se encaixa bem em sua necessidade, de uma olhada no tutorial do XStream http://xstream.codehaus.org/, é bem pequeno.

Se vc gostar da idéia acredito que fluxo ficaria + ou - assim.

client

  1. Criar instancia da classe VJogador.
  2. “Serializar” o objeto criado no passo 1 utilizando o XStream.
  3. Executar a chamada remota em um método passando o xml resultante do passo 2 como parametro (será um tipo string).

server

  1. Receber a execução do método acionada pelo client.
  2. “Deserializar” o xml passado pelo client (obtido no parametro do método) utilizando o XStream.
  3. Executar a ação desejada baseada no objeto retornado pelo XStream.

E isso ai…o vc acha?

flws

hmmm ai sim… bem funcional funcional.
ainda n tive tempo de olhar certinho pq estou no trabalho…

Massss…ainda nao é o que eu quero.
pensemos com o chapolin colorado que ha dentro de nos
^^
a ideia eh funcional mas nao é exatamente o que estou buscando…
se for pra eu passar a string.
ter q montar ela de um lado e desmontar de outro…

ate poderia usar o Tokenizer
monto a string q representa o objeto… depois pego a string e refaço o objeto…

queria algo mais facil e direto…
automatico.
que por ex eu so mapeasse ou escrevesse o codigo…os métodos necessarios dentro do meu objeto…
e na hora do xml-rpc tentar transportar ele monta o xml do objeto a partir disso…
e ele mesmo trata de Serializar e Remontar o objeto.

Então, dei uma olha rápida na situação.

Para utilizar o xml-rpc neste seu caso acho que não vai ser tão simples. A versão que verifiquei foi a apache-xmlrpc-3.1.2 e na doc. na página apache-xmlrpc-3.1.2/docs/advanced.html eles explicam como implementar novos tipos. Mas notei que os tipos sugeridos são tipos previstos na API Java que infelizmente não é o seu caso.

Acredito que seja possível vc “serializar” um objeto definido por vc, mas para isto vc teria que pegar a API deles e procurar uma porta pronta para vc “anexar” seu “esquema” de “serialização”. Se isto não der certo, a sugestão é você observar a API deles mais de perto e fazer as mesmas coisas que eles fizeram para “serializar” os outros objetos, ou seja, implementar inferfaces, derivar classes e etc… até chegar na classe TypeFactoryImpl, daí por diante é seguir o tutorial; talvez isto dê certo.

P.S. Fique atento se vc for seguir esta idéia; a classe do objeto que foi serializado no client tem que estar presente no classpath do sistema server.

flws

Buenas
vlws fantomas
vo da uma olha ae…

e ver o que eu consigo :frowning:
se alguem quiser ajudar a implementar
eu aceito ajuda :stuck_out_tongue:

ou se alguem ja fez algo parecido e talz…

sobre o ps fantomas…
tranquilo…
o objeto vai estar num jar Comun entre servidor e aplicação.

fantomas
como voce chegou a essa documentação q vc sitou…
n sei acessar direito o javadoc das apis…
:oops:
nunca fui mto de olhar a documentaçao assim…
so olhar a documentação na net…

tenho o jar javadoc do xml-rpc 3.1.1 aki…
mas nao sei acessar ele…
:oops:


vc tbm falou em tutorial…
seria qual tutorial ?

tutorial apache-xmlrpc-3.1.2\docs

docs da api apache-xmlrpc-3.1.2\docs\apidocs

flws

essas urls n funcionam aki nao…
pode passar o link?

[quote=Fernando H. Gomes]essas urls n funcionam aki nao…
pode passar o link?[/quote]
google -> apache xml rpc api -> 1º link