상세 컨텐츠

본문 제목

.Net XML RPC ( Client )

.Net General/.Net XML-RPC

by 탑~! 2011. 11. 17. 10:52

본문


using System; 
using System.IO;
using System.Text;
using System.Net;
using CookComputing.XmlRpc;

struct userInfo { //사용자 정보 구조체
  public string s_user_id;
  public byte[] bt_user_name;
  public string s_user_email;
};

struct attatchFile {  //첨부파일 다운로드 정보 구조체
  public byte[] bt_file_name;
  public string s_download_url;
};

struct contentInfo {  // 글정보 구조체
  public string s_message_id;
  public byte[] bt_title;
  public byte[] bt_body;
  public string s_url;
  public DateTime dt_date;
};

struct responseInsert { // 글등록시 응답메시지 구조체
  public string s_message_id;
  public string s_url;
};

struct responseGetMessage {
  public bool b_has_next;
  public contentInfo[] a_message_list;  
};

 

// XML-RPC 서버를 설정한다.
[XmlRpcUrl("http:/....(경로)..../rpc/rpcServer.rem")]
  interface RemoteMethod { 
  // 서버에서의 메서드를 매칭시킨다.
  [XmlRpcMethod("service.insertMessage")] 
  responseInsert insertMessage(
    userInfo user,
    string[] category,
    contentInfo content,
    attatchFile[] file);
  // 서버에서의 메서드를 매칭시킨다.  
  [XmlRpcMethod("service.getMessageList")] 
  responseGetMessage getMessageList(
    userInfo user,
    string[] category,
    int i_page_content_count,
    int i_page_view_num);
}

// 서버로의 매칭에 대해서는, 서버와 클라이언트의 메서드 정의부분이 일치한다면

// 라이브러리에서 자동으로 서버클래스에 대해 매칭시켜주며 클라이언트에서 사용하기 위해서 그냥 로컬메서드를

// 호출하는 형식으로 하는 방식이다.

 

 

class clientTest {
  // 클라이언트 클래스를 컴파일하여 생긴 실행파일을 통해 클라이언트를 작동한다.
  static void Main() {
    // 서버클래스에 대해 매핑을 시켜준다. 프록시서버가 생성하는 객체는 위에서 정의한 인터페이스 객체여야 한다.

    RemoteMethod proxy = (RemoteMethod)XmlRpcProxyGen.Create(typeof(RemoteMethod));
    object[] param = new object[4]; //메서드를 호출할때 파라미터로 넘기기 위해 
    try {
      // 테스트 #1
      settingSampleData1(param);
      responseInsert result1 = proxy.insertMessage((userInfo)param[0], (string[])param[1], (contentInfo)param[2], (attatchFile[])param[3]);
      printResult1(result1, param);
      
      // 테스트 #2
      settingSampleData2(param);
      responseGetMessage result2 = proxy.getMessageList((userInfo)param[0], (string[])param[1], (int)param[2], (int)param[3]);
      printResult2(result2, param);
    } catch (Exception e) {
      Console.Write(e);
    }
  }
  // 첫번째 메서드 호출을 할때 넘겨야 하는 값들을 세팅한다.
  static void settingSampleData1(object[] param) {
    userInfo user = new userInfo();
    string[] category = new string[3];
    contentInfo content = new contentInfo();
    attatchFile[] file = new attatchFile[2];
    
    System.Text.Encoding EncodingType = System.Text.Encoding.GetEncoding("ks_c_5601-1987"); //한글지원
    
    //사용자 정보
    user.s_user_id = "9namy";
    user.bt_user_name = EncodingType.GetBytes("최규남");
    user.s_user_email = "9namy@netville.co.kr";
    
    // 카테고리 정보
    category[0] = "category1";
    category[1] = "category2";
    category[2] = "category3";
    
    //글 정보
    content.bt_title = EncodingType.GetBytes("제목입니다");
    content.bt_body = EncodingType.GetBytes("내용입니다");
    content.s_message_id = "1234";
    content.s_url = "http://localhost:8080/xxx.html";
    content.dt_date = new DateTime(1979, 7, 28, 5, 23, 15, 16);
    
    //첨부파일 목록
    file[0].bt_file_name = EncodingType.GetBytes("hana.jpg");
    file[0].s_download_url = "http://211.62.34.144:8080/prototype/Download?haha.jpg";
    file[1].bt_file_name = EncodingType.GetBytes("file3.jpg");
    file[1].s_download_url = "http://127.0.0.1/rpc/upload/file3.jpg";
    //file[2].bt_file_name = EncodingType.GetBytes("haha.jpg");
    //file[2].s_download_url = "http://211.62.34.144:8080/prototype/Download?haha.jpg";
    
    param[0] = user;
    param[1] = category;
    param[2] = content;
    param[3] = file;
  }

  // 첫번째 메서드 호출을 할때 파라미터값과 결과값을 화면에 뿌린다.

  static void printResult1(responseInsert result, object[] param) {
    userInfo user = (userInfo)param[0];
    string[] category = (string[])param[1];
    contentInfo content = (contentInfo)param[2];
    attatchFile[] file = (attatchFile[])param[3];
    
    Console.Write("=============== Test1 =================\n");
    Console.Write("----------------파라미터----------------------\n");
    Console.Write(user.s_user_id + "\t");
    Console.Write(System.Text.Encoding.Default.GetString(user.bt_user_name) + "\n");
    Console.Write(category[0] + "\t" + category[1] + "\t" + category[2] + "\n");
    Console.Write(System.Text.Encoding.Default.GetString(content.bt_title) + "\t");
    Console.Write(System.Text.Encoding.Default.GetString(content.bt_body) + "\n");
    for(int i=0; i< file.Length ; i++) {
      Console.Write(System.Text.Encoding.Default.GetString(file[i].bt_file_name) + "\t");
      Console.Write(file[i].s_download_url + "\n");
    }
    Console.Write("---------------------------------------------\n");
    Console.Write("-----------------결과값 -----------------------\n");
    Console.Write(result.s_message_id + "\t");
    Console.Write(result.s_url + "\n");
    Console.Write("----------------------------------------------\n");
    Console.Write("=======================================\n\n\n");
  }

  // 두번째 메서드 호출을 할때 넘겨야 하는 값들을 세팅한다.  
  static void settingSampleData2(object[] param) {
    userInfo user = new userInfo();
    string[] category = new string[3];
    int i_page_content_count = 2;
    int i_page_view_num = 10;
    
    System.Text.Encoding EncodingType = System.Text.Encoding.GetEncoding("ks_c_5601-1987"); //한글지원
    
    //사용자 정보
    user.s_user_id = "9namy";
    user.bt_user_name = EncodingType.GetBytes("최규남");
    user.s_user_email = "9namy@netville.co.kr";
    
    // 카테고리 정보
    category[0] = "category1";
    category[1] = "category2";
    category[2] = "category3";
    
    param[0] = user;
    param[1] = category;
    param[2] = i_page_content_count;
    param[3] = i_page_view_num;
  }

  // 두번째 메서드 호출을 할때 파라미터값과 결과값을 화면에 뿌린다.  
  static void printResult2(responseGetMessage result, object[] param) {
    userInfo user = (userInfo)param[0];
    string[] category = (string[])param[1];
    int i_page_content_count = (int)param[2];
    int i_page_view_num = (int)param[3];
    
    contentInfo[] list = (contentInfo[])result.a_message_list;
    
    Console.Write("=============== Test2 =================\n");
    Console.Write("----------------파라미터----------------------\n");
    Console.Write(user.s_user_id + "\t");
    Console.Write(System.Text.Encoding.Default.GetString(user.bt_user_name) + "\n");
    Console.Write(category[0] + "\t" + category[1] + "\t" + category[2] + "\n");
    Console.Write("목록페이지 번호 : " + i_page_content_count + "\t페이지 당 글수 : " + i_page_view_num + "\n");
    Console.Write("---------------------------------------------\n");
    Console.Write("-----------------결과값 -----------------------\n");
    Console.Write("다음페이지 존재유무 : " + (bool)result.b_has_next + "\n");
    Console.Write("...................... 글정보 ......................\n");
    for(int i=0 ; i< list.Length; i++) {
    contentInfo info = list[i];
    Console.Write(System.Text.Encoding.Default.GetString(info.bt_title) + "  ");
    Console.Write(info.dt_date.ToString("yyyy-MM-dd HH:mm:ss") + "  ");
    Console.Write(info.s_url + "\n");
    Console.Write("....................................................\n");
    }
    Console.Write("----------------------------------------------\n");
    Console.Write("=======================================\n\n\n");
  }
}

출처 : http://blog.naver.com/9namy

'.Net General > .Net XML-RPC' 카테고리의 다른 글

두번째 메서드의 Request xml  (0) 2011.11.17
첫번째 메서드의 Request xml  (0) 2011.11.17
.Net XML RPC 설정  (0) 2011.11.17
.Net XML RPC ( Server )  (0) 2011.11.17
.Net XML RPC  (0) 2011.11.17

관련글 더보기