"Cogito ergo sum"
RSS icon Email icon Home icon
  • Cliente e Servidor, Java XML-RPC

    Posted on May 16th, 2009 Matheus (X-warrior) Bratfisch 3 comments

    Boa noite,

    Como havia comentado a algum tempo atrás, estava trabalhando com um cliente XML-RPC em Java, durante a fase de desenvolvimento do mesmo tive que criar um servidor XML-RPC hipotetico para testar as funcionalidades do cliente, enquanto o servidor certo ainda não estava disponivel para minha pessoa.

    Resumidamente para você que não conhece XML-RPC ele é um “formato” , um “jeito”, não sei ao certo a palavra certa para definir agora, onde você cria um servidor e o mesmo quando requisitado faz as operações necessarias e retorna um resultado. Um exemplo seria, você tem um código de criptografia que funciona MUITO bem em C, mas seu sistema é todo em Java, você poderia criar um Cliente JAVA e um Servidor C onde o Java faria requisição para Criptografar as coisas. Talvez utilizar XML-RPC de Java para Java possa ser meio estranho, mas quando os serviços estão distantes, pode ser algo util.

    Para começar a mecher com o XML-RPC no Java eu utilizei o apache xml-rpc. Após isso apenas desenvolvi.

    Baixe os exemplos cliente e servidor xml-rpc em java.

    Servidor:

    package xmlrpc;

    import org.apache.xmlrpc.server.PropertyHandlerMapping;
    import org.apache.xmlrpc.server.XmlRpcServer;
    import org.apache.xmlrpc.webserver.WebServer;

    public class ServidorXMLRPCParaTestes {

    private static ServidorXMLRPCParaTestes euMesmo = null;

    private ServidorXMLRPCParaTestes() {
    try {
    WebServer server = new WebServer(8185); // Cria um servidor na porta 8185
    XmlRpcServer servidor = server.getXmlRpcServer(); // Pega o servidor XmlRpc
    PropertyHandlerMapping phm = new PropertyHandlerMapping();
    phm.addHandler(”Calc”, Calculadora.class); // Adiciona um novo “handler” ao PHM
    servidor.setHandlerMapping(phm); // Define o handler no servidor
    server.start(); // inicia o servidor.
    } catch (Exception exception) {
    System.err.println(”JavaServer: ” + exception);
    }
    }

    public static ServidorXMLRPCParaTestes obterInstância() {
    if (euMesmo == null)
    euMesmo = new ServidorXMLRPCParaTestes();
    return euMesmo;
    }
    }

    - Eu utilizeo o obterInstancia para não poder existir mais de um ServidorXMLRPC ;)
    - O handler faz o seguinte, quando for chamado Calc.METODO no servidor ele irá buscar dentro do Calculadora.class

    Handler Calculadora:

    package xmlrpc;

    public class Calculadora {

    public int soma(int x, int y) {
    return x + y;
    }
    public int subtracao(int x, int y) {
    return x – y;
    }

    }

    Cliente XML-RPC generico:

    package xmlrpc;

    import java.net.URL;
    import org.apache.xmlrpc.*;
    import org.apache.xmlrpc.client.XmlRpcClient;
    import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

    public class ClienteXmlRpc {

    private static final String urlServidor = “http://localhost:8185″; //DEFINE A URL DO SERVIDOR
    private XmlRpcClient xmlrpc;

    public ClienteXmlRpc() {
    try {
    XmlRpcClientConfigImpl configuraçãoCliente = new XmlRpcClientConfigImpl();
    configuraçãoCliente.setServerURL(new URL(urlServidor));

    xmlrpc = new XmlRpcClient();
    xmlrpc.setConfig(configuraçãoCliente);

    } catch (Exception exception) {
    exception.printStackTrace();
    }
    }

    public Object executar(String comando, Object[] parametros) {
    try {
    Object resposta = xmlrpc.execute(comando, parametros);
    return resposta;
    } catch (XmlRpcException e) {
    e.printStackTrace();
    return null;
    }
    }

    }

    - Acredito que o Cliente XML-RPC e o Cliente são auto-explicativos. Qualquer duvida entre em contato.

    CalculadoraCliente:

    package cliente;

    import xmlrpc.ClienteXmlRpc;

    public class CalculadoraCliente {
    private ClienteXmlRpc cliente;

    public CalculadoraCliente() {
    cliente = new ClienteXmlRpc();
    }

    public int soma(int x, int y) {
    Object[] parametros = new Object[]{new Integer(x), new Integer(y)};
    Integer resultado = (Integer) cliente.executar(”Calc.soma”, parametros);
    return resultado;
    }

    public int subtracao(int x, int y) {
    Object[] parametros = new Object[]{new Integer(x), new Integer(y)};
    Integer resultado = (Integer) cliente.executar(”Calc.subtracao”, parametros);
    return resultado;
    }
    }

    Para rodar os mesmos e testar gerei 2 classes com main e executei as mesmas (executando primeiro o servidor é claro)

    RodarServidor:

    import xmlrpc.ServidorXMLRPCParaTestes;

    public class RodarServidor {

    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ServidorXMLRPCParaTestes Servidor = ServidorXMLRPCParaTestes.obterInstância();
    }

    }

    RequisicaoCliente:

    import cliente.CalculadoraCliente;

    public class RequisicaoCliente {

    /**
    * @param args
    */
    public static void main(String[] args) {
    CalculadoraCliente x = new CalculadoraCliente();
    System.out.println(x.soma(1, 1));
    }

    }

    Abraços,
    Matheus

     

    3 responses to “Cliente e Servidor, Java XML-RPC”

    1. Matheus, valeu pelo post cara, eu procurei por todo canto um exemplo que funcionasse e nenhum funcionava, mas o seu funcionou.

      Agora, eu gostaria de saber se você sabe como fazer pra enviar arquivos usando xml-rpc.

      Abraço

    2. [...] resolvi dar uma rápida pesquisada para ensina-lo. Acabei me entretendo e resolvi modificar o Cliente e Servidor Java XML-RPC para fazer o [...]

    3. Jorge,

      Criei um post para auxiliar você, caso tenha algum problema entre em contato.

      Abraço,
      Matheus

    Leave a reply