Set 17 2009

Enviar arquivos via XML-RPC em Java.

Olá,

Hoje o Jorge me perguntou se eu sabia como enviar arquivos via XML-RPC. Pensando no assunto não me recordava como devia ser feito, 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 mesmo.

Implementei o mesmo e não foi complexo só olhei a documentação do Apache XML-RPC para ver como eram enviados bytes. Os mesmos eram enviados codificando o array de bytes (byte[]) em Base64. Pesquisei um pouco como fazer isso e achei uma Biblioteca Java de Base64 em dominio publico. Também procurei por como pegar o array de bytes de um arquivo e como criar um novo arquivo apartir de um array de bytes (byte[]).

Esses sites onde peguei ambos os métodos estão como comentarios no arquivo.

XML-RPC-Transferencia-De-Arquivo

Espero que seja útil,
Matheus

PS: Da maneira como eu implementei qualquer arquivo do sistema que o Cliente XML-RPC pedir o Servidor irá enviar, isso criaria uma possivel brecha de segurança.

PS2: Caso deseja que o Cliente envie arquivos para o Servidor, o Cliente deve pegar o array de bytes do Arquivo, codifica-lo em base64 e passa-lo como parametro. O Servidor irá receber este parametro, decodificar após isso manipu-le o array de bytes como você desejar.

Mai 26 2009

Compartilhar internet com servidor na porta WAN.

Boa tarde,

Os ultimos dias passei instalando o servidor e com uns problemas para configurar o mesmo. Eu sabia como configurar a rede para funcionar da seguinte maneira:

MODEM -> (eth0) Servidor (eth1) -> (Porta lan) Router (Portas lan) -> Computadores

Porém não era essa topologia que eu desejava, pois com está eu perdia a porta WAN do meu roteador. Então decidi fazer a seguinte:

MODEM -> (eth0) Servidor (eth1) -> (Porta WAN) Router (Portas LAN) -> Computadores

Inicialmente, deixei meu servidor ligado somente ao modem e testei se o mesmo conseguia pingar a internet. Até o momento tudo ok.

Acessei o arquivo “/etc/network/interfaces” e configurei a eth1 manualmente da seguinte maneira:

auto eth1
iface eth1 inet static
address 192.168.100.254
netmask 255.255.255.0
network 192.168.100.0
broadcast 192.168.100.255

Logo em seguida adicionei as regras de iptables:

sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING –out-interface eth0 -j MASQUERADE
iptables -A FORWARD –in-interface eth0 -j ACCEPT

Teoricamente o compartilhamento de internet já devia estar funcionando. Mas não foi isso que aconteceu. Resolvi acessar o meu Roteador pela Lan e configura-lo manualmente da seguinte maneira:

IP Address : 192.168.100.1
Subnet Mask : 255.255.255.0
ISP Gateway Address : 192.168.100.254
Primary DNS Address : 200.247.141.11 (DNS VIRTUA SC)
Secondary DNS Address : 200.247.141.12 (DNS VIRTUA SC)

Salvei as modificações, esperei o mesmo ser reiniciado e pronto. Conexão funcionando.

Eu sei que isso não ficou como um tutorial, ficou um “relato” mas este relato pode lhe ajudar a configurar se você seguir os mesmos passos que eu. Lembre-se também que as regras de iptables devem ser executadas sempre na inicialização do servidor. Saiba mais sobre Executar scripts ao iniciar computador.

Demorei bastante tempo e testei várias configurações para que conseguisse tudo funcionando mas acredito que o meu maior problema foi ter usado a mesma Classe de IPS para a rede interna (atrás do roteador) e a “externa” (comunicação entre o roteador e servidor).

Qualquer problema com Compartilhamento ou coisas do tipo, não hesite em perguntar.

Espero que este artigo seja de grande ajuda,
Matheus

Agradecimentos ao Ubuntu Forum que me deu uma ajuda.

Mai 16 2009

Cliente e Servidor, Java XML-RPC

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

Read more »