Programming/Remote,Distributed

XML-RPC Java / Android 개발 환경 구축

Lawmin 2011. 3. 31. 17:31
XML-RPC Spec.
http://www.xmlrpc.com/

Apache XML-RPC Java Lib.
http://ws.apache.org/xmlrpc/

Android XML-RPC Lib. (Java)
http://code.google.com/p/android-xmlrpc/

ws-commons-java5-1.0.jar (JDK 5 이전 버전에서 JDK 5의 클래스를 이용하기 위한 class)
http://mirrors.ibiblio.org/pub/mirrors/maven2/ws-commons-java5/ws-commons-java5/1.0/ws-commons-java5-1.0.jar

Retrotranslator (JDK 5 이후 class, jar 들을 이전 버전 호환으로 만들어 주는 툴)
http://retrotranslator.sourceforge.net/

1. Server (1.4 도 가능)
Java Project를 만들고 Apache XML-RPC Lib.을 Build Path - Libraries 에 추가
(1.4 용으로 만들려면 관련 Lib. 을 Retrotranslator를 이용해 호환 버전으로 변환할 것)

Data.java (기본 Java Type 및 Map이 아닌 클래스 단위 전송시 Serializable을 구현해야 하고 byte 단위 전송하여 비교적 빠름)
public class Data implements Serializable {
public int val;
}

Calc.java
public class Calc {
public Data addAndReturnSerializable(int i1, int i2) {
Data d = new Data();
d.val = i1 + i2;
return d;
}
public Map addAndReturnMap(int i1, int i2) {
Map m = new HashMap();
m.put("value", String.valueOf(i1 + i2));
return m;
}
}
 
Server.java
public class Server {
private static final int port = 8080;

public static void main(String[] args) throws Exception {
WebServer webServer = new WebServer(port);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();

PropertyHandlerMapping phm = new PropertyHandlerMapping();
phm.load(Thread.currentThread().getContextClassLoader(), "MyHandlers.properties");
xmlRpcServer.setHandlerMapping(phm);

XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);

webServer.start();
}
}
 
MyHandlers.properties
Calc=test.Calc 

2. Java-Client
Java Project를 만들고 Apache XML-RPC Lib.을 Build Path - Libraries 에 추가

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
XmlRpcClient client = new XmlRpcClient();
config.setEnabledForExtensions(true); // Serializable 구현 클래스(여기선 Data)를 송신시에 true로 설정해야함 -> 빠른 속도
client.setConfig(config);
Object[] params = new Object[]{new Integer(33), new Integer(9)};

//Map m = (Map)client.execute("Calc.add", params);
//System.out.println(m.get("value"));
Data d = (Data)client.execute("Calc.addAndReturnSerializable", params);
System.out.println(d.val);     

3. Android-Client (1.5 이상)
Android Project를 만들고 Android XML-RPC Lib.을 src 쪽에 풀어 넣음
환경을 만들다보니 Apache XML-RPC Java Lib. (v3.1.3)를 사용하지 못하는 것으로 보이며,
분석해보니 내부적으로 SAXParser를 사용하는데 Validate 관련 xml 파일에 접근하지 못하여 런타임시 오류가 난다.
Android 용으로 개발된 XML-RPC는 SAXParser를 XMLPullParser로 대체하여 이 문제를 해결하고 있다.

간단히 Calc의 Add 메서드를 호출하여 결과를 가져오는 코드는 다음과 같다.

try {
    XMLRPCClient client = new XMLRPCClient("http://10.0.2.2:8080/xmlrpc");
    TextView v = (TextView)findViewById(R.id.MyTextView);
    //Map map = (Map)client.call("Calc.add", 2, 4);
    //v.setText((String)map.get("value"));
    Data d = (Data)client.call("Calc.add", 2, 4);
    v.setText(String.valueOf(d.val));
}
catch(Exception e) {
    e.printStackTrace();
}

10.0.2.2 는 안드로이드 에뮬레이터에서 개발PC 에 있는 서버 접근할때 쓰는 IP 임 (127.0.0.1)