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
두번째 메서드의 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 |