본문 바로가기

웹서비스

[JAVA] XML-RPC

출처 : http://mindconverter.tistory.com/11

ObjectStream을 이용한 방식에 이어 두번째로
XML-RPC를 이용한 방식이 되겠다..

같은 Domain Object 를 서버에 넘겨서 리턴받는 형태로 테스트를 진행한다.

우선 XML-RPC는 Apache재단에서 만든 걸 사용한다.
http://www.apache.org/dyn/closer.cgi/ws/xmlrpc/
여기서 최신꺼 다운받으면 되겠다.. 당근 이걸 classpath에 넣어줘야 겠지...

Domain을 같은걸 사용한다 했으니깐. ImageInformation 요 객체에 대해서는 딴지 걸지 말자... 바로 앞 글에 있다.



우선 클라이언트를 만들어보자...

package communications.xmlrpc.client;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.Vector;

import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;

import communications.domain.ImageInformation;

public class ImageXmlRpcClient {

private static final String RemoteURL = "http://localhost/comm/XmlRpcServer";

private XmlRpcClient client = null;

private ImageXmlRpcClient()
{
try{
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
XmlRpc.setEncoding("euc-kr");
// XmlRpc.setDebug(true); //디버깅 내용이 많이 찍혀서 임시로 주석했다.
client = new XmlRpcClient(RemoteURL);
}catch(ClassNotFoundException ce ){ ce.printStackTrace(System.err); }
catch(MalformedURLException me){ me.printStackTrace(System.err); }
}

public ImageInformation getImageConverterData( ImageInformation imgInfo ){
//Create request
Vector params = new Vector();

params.add( imgInfo.getImgUrl() );
params.add( imgInfo.getImgFormat() );
params.add( imgInfo.getImgConvFormat() );
params.add( "T" ); //xml-rpc는 특정 형태의 데이터만 지원하기 때문에 boolean 타입인 것을 임의로 String으로 바꿨다. 최신버전은 Boolean 타입을 지원하더라.... http://ws.apache.org/xmlrpc/types.html여기 가면 자세히 나왔다.

ImageInformation retImgInfo = new ImageInformation();

//서버에 연결하여 결과 값을 가져오자!!
try{
Hashtable result = (Hashtable)client.execute("ServerBus.echoClientData", params); //이게 머냐.. 서버에 ServerBus라고 바인딩 된 클래스의 echoClientData()라는 메소드에 params를 넘겨서 리턴 받는 다는 거다...


if(result != null ){
retImgInfo.setImgUrl( (String)result.get("imgUrl") );
retImgInfo.setImgFormat( (String)result.get("imgFormat") );
retImgInfo.setImgConvFormat( (String)result.get("imgConvFormat"));
retImgInfo.setQualityBest( true );
}

}catch(IOException ie ){ ie.printStackTrace(System.err); }
catch(XmlRpcException xe ){ xe.printStackTrace(System.err); }


return retImgInfo;
}

public static void main( String[] args ) throws Exception {
long startTime = System.currentTimeMillis();
System.out.println( "test" );

ImageXmlRpcClient client = new ImageXmlRpcClient();

ImageInformation imgInfo = new ImageInformation( "URL", "FORMAT", "CONV_FORMAT", true );
ImageInformation retImgInfo = null;
retImgInfo = client.getImageConverterData(imgInfo);

System.out.println( retImgInfo.toString() );

System.out.println( "end:" + (System.currentTimeMillis()- startTime)+"ms" );
}


}


이제 서버를 만들어보자..


package communications.xmlrpc.server;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcServer;

public class ImageXmlRpcServerServlet extends HttpServlet implements Servlet {

private XmlRpcServer xmlrpc;

public void init(ServletConfig arg0) throws ServletException {
super.init(arg0);

XmlRpc.setEncoding("euc-kr");
XmlRpc.setKeepAlive(false);
// XmlRpc.setDebug(true);

xmlrpc = new XmlRpcServer();
xmlrpc.addHandler("ServerBus", new ServerBus() ); //ServerBus라는 클래스를 ServerBus라는 이름으로 등록했다.

}

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
System.out.println("GET+++++++++++++++++++++++++++++");

res.setHeader("Content-Type", "text/html; charset=euc-kr");
PrintWriter out = res.getWriter();
out.println("잘못된 접근입니다.");
}

protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
byte[] result = xmlrpc.execute( req.getInputStream() );

res.setContentType("text/xml");
res.setContentLength( result.length );

OutputStream output = res.getOutputStream();
output.write( result );
output.flush();
}


}


이제 진짜 데이터를 처리하는 Bus를 만들어 보자. 위에 주석에 적었듯이 위 서버는 ServerBus를 바인딩하고만 있다...

package communications.xmlrpc.server;

import java.util.Hashtable;

import communications.domain.ImageInformation;

public class ServerBus {
public Hashtable echoClientData( String imgUrl, String imgFormat, String imgConvFormat, String qualityBest ) {

ImageInformation imgInfo = new ImageInformation( imgUrl, imgFormat, imgConvFormat, true );

System.out.println( "++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println("Read Object value is " + imgInfo.toString());
System.out.println( "++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

imgInfo.setImgUrl("SERVERIMGURL");

Hashtable ht = new Hashtable();
ht.put("imgUrl", imgInfo.getImgUrl());
ht.put("imgFormat", imgInfo.getImgFormat() );
ht.put("imgConvFormat", imgInfo.getImgConvFormat() );
ht.put("qualityBest", "T" );

return ht;
}
}


이 메소드를 client에서 호출 한거다...

이렇게 해서 XML-RPC를 사용한 것두 끝났다...

이렇게 XML-RPC를 내부적으로 사용한 것으로 유명한건 SOAP이 있겠다...

다음번 테스트는 멀로할지 생각중이다....

'웹서비스' 카테고리의 다른 글

[JSP] XML 읽기  (0) 2010.06.30
SOAP의 개념 (간단예제)  (0) 2010.06.30
HTTP/XML 기반  (0) 2010.06.30
[Java] XML Validation 비활성화 하기  (0) 2010.06.29
[JAVA] XML 통신  (0) 2010.06.28