태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
페이지를 읽고 있습니다. ( 아쿠아바다's Blog )
분류 전체보기 (769)
쉐어포인트 (24)
Exchange (12)
SQL (121)
XML (36)
WEB (294)
O / S (97)
삶의향기 (162)
기획 (19)
RSS 피드(IE 7.0부터 기본 지원됩니다. 이전 버전 사용자는 접합한 툴을 사용하세요!!)

XML-RPC를 이용한 원격 메소드 호출

XML 2007/06/07 13:59 by 아쿠아바다

(Terms 참조) RPC : 한 프로그램이 네트워크 상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜


RPC는 Remote Procedure Call의 약자로, 분산 환경에서 이기종간의 프로그램을 인터넷을 통해 호출할 수 있도록 하는 기술입니다. 즉, RPC를 통해 다른 시스템에 있는 함수 또는 메소드를 호출할 수 있는 것입니다.



XML-RPC는 HTTP 프로토콜 상에서 데이터를 XML 방식으로 인코딩하여 전송합니다.

XML-RPC diagram by JY Stervinou:

XML-RPC에 대한 자세한 내용은 http://www.xmlrpc.com 에서 찾아보실 수 있습니다.




여기서는 자바를 예제로 하여, XML-RPC를 어떻게 사용하는지 알아보도록 하겠습니다.



1. XML-RPC의 동작 방식

XML-RPC는 HTTP 기반의 클라이언트/서버 방식으로 동작합니다. 따라서 XML-RPC 서비스를 하기 위해서는 반드시 XML-RPC 서버가 필요합니다. XML-RPC 서버는 클라이언트로부터 특정 객체의 메소드 호출 요청을 받고, 그 메소드를 실행시켜주는 역할을 합니다.

XML-RPC API (http://ws.apache.org/xmlrpc/apidocs/index.html) 를 보면, WebServer 클래스를 찾아볼 수 있는데 이 클래스가 XML-RPC 서버 역할을 하는 클래스입니다.



2. XML-RPC 서버 만들기

XML-RPC 서버는 WebServer 클래스 또는 XmlRpcServer 클래스를 이용해 작성할 수 있습니다. 아래의 코드를 보면 addHandler라는 메소드를 볼 수 있는데, 이 메소드를 이용해 클라이언트가 이용할 객체를 등록할 수 있습니다.


예제) XML-RPC 서버

    import java.util.Hashtable;
    import org.apache.xmlrpc.*;
   
    public class JavaServer {
   
        public JavaServer () {
            // Our handler is a regular Java object. It can have a
            // constructor and member variables in the ordinary fashion.
            // Public methods will be exposed to XML-RPC clients.
        }
   
        public Hashtable sumAndDifference (int x, int y) {
            Hashtable result = new Hashtable();
            result.put("sum", new Integer(x + y));
            result.put("difference", new Integer(x - y));
            return result;
        }
   
        public static void main (String [] args) {
            try {
               
                // Invoke me as <http://localhost:8080>.
                WebServer server = new WebServer(8080);
                server.addHandler("sample", new JavaServer());

                server.start();

   
            } catch (Exception exception) {
                System.err.println("JavaServer: " + exception.toString());
            }
        }
    }



3. XML-RPC 클라이언트 만들기

XML-RPC 클라이언트는 서버와 마찬가지로 매우 간단하게 작성할 수 있는데, XmlRpcClient 클래스를 이용하여 다른 시스템의 객체에 접근할 수 있습니다. 메소드의 호출은 XmlRpcClient의 execute 메소드를 이용하여 할 수 있습니다. 이 때 호출할 다른 시스템의 메소드에 넘겨줄 인자(parameter)는 Vector에 담아 넘기도록 하고 있습니다.


예제) XML-RPC 클라이언트

    import java.util.Vector;
    import java.util.Hashtable;
    import org.apache.xmlrpc.*;

   
    public class JavaClient {
   
        // The location of our server.
        private final static String server_url =
            "http://localhost:8080";
   
        public static void main (String [] args) {
            try {
   
                // Create an object to represent our server.
                XmlRpcClient server = new XmlRpcClient(server_url);
   
                // Build our parameter list.
                Vector params = new Vector();
                params.addElement(new Integer(5));
                params.addElement(new Integer(3));
   
                // Call the server, and get our result.
                Hashtable result =
                    (Hashtable) server.execute("sample.sumAndDifference", params);
                int sum = ((Integer) result.get("sum")).intValue();
                int difference = ((Integer) result.get("difference")).intValue();
   
                // Print out our result.
                System.out.println("Sum: " + Integer.toString(sum) +
                                   ", Difference: " +
                                   Integer.toString(difference));
   
            } catch (XmlRpcException exception) {
                System.err.println("JavaClient: XML-RPC Fault #" +
                                   Integer.toString(exception.code) + ": " +
                                   exception.toString());
            } catch (Exception exception) {
                System.err.println("JavaClient: " + exception.toString());
            }
        }
    }



4. XML-RPC 서버 서블릿 만들기

XML-RPC가 HTTP 기반이므로, 서블릿으로 XML-RPC 서버를 만들 수 있습니다. 이렇게 하면, 클라이언트에서 서블릿의 URL로 접근하여, 원격으로 메소드를 호출할 수 있습니다.


예제) XML-RPC 서버 서블릿 만들기

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import org.apache.xmlrpc.*;

    public class XmlRpcServlet extends HttpServlet {

        protected XmlRpcServer xmlrpc;
   
        public void init(ServletConfig config) throws ServletException {
            XmlRpc.setEncoding("euc-kr");
            XmlRpc.setKeepAlive(true);
            xmlrpc = new XmlRpcServer();
            xmlrpc.addHandler("hello", new HelloHandler());
            XmlRpc.setDebug(false);
        }

        // doPost , doGet

        public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
            //maintenance of public security
            //String auth = request.getHeader( "Authorization" );
            byte[] result = xmlrpc.execute( request.getInputStream() );
            response.setContentType( "text/xml" );
            response.setContentLength( result.length );
            OutputStream output = response.getOutputStream();
            output.write( result );
            output.flush();
        }

    }



5. XML-RPC Tip

XML-RPC를 이용한 원격 메소드 호출 시 인자와 리턴 값이 HTTP 프로토콜을 통해 전송되기 때문에 인자와 리턴 값은 반드시 Serializable한 객체여야 합니다.


아래 표는 현재 아파치 XML-RPC에서 사용 가능한 타입입니다.

XML-RPC data type Data Types generated by the Parser Types expected by the Invoker as input parameters of RPC handlers
<i4> or <int> java.lang.Integer int
<boolean> java.lang.Boolean boolean
<string> java.lang.String java.lang.String
<double> java.lang.Double double
<dateTime.iso8601> java.util.Date java.util.Date
<struct> java.util.Hashtable java.util.Hashtable
<array> java.util.Vector java.util.Vector
<base64> byte[ ] byte[ ]




========================================================================================

2004-09-15 조재호(tinywolf@korea.com)


이 글은 자바캔 에서도 보실 수 있습니다.

자바캔 원고 보기 : http://javacan.madvirus.net/main/content/contentRead.jsp?contentNo=95&block=1 

'XML' 카테고리의 다른 글

새로운 AJAX - Asynchronous Javascript And XML  (0) 2007/06/07
xmlrpc 관련 참조  (0) 2007/06/07
XML-RPC를 이용한 원격 메소드 호출  (0) 2007/06/07
XML Tree Viewer  (0) 2007/06/07
ADO 2.5 Streams and XML  (0) 2007/06/07
xmlrpc - javascript 연동  (0) 2007/06/07
좀더 흥미로운 내용이 많이 있습니다.. HOME > XML를 확인하세요
TAG ,   
0 Trackback, 0 Comment, :
1  ... 476 477 478 479 480 481 482 483 484  ... 769 
Statistics Graph
Total : 557,403 Today : 33