출처 : 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 |