SlideShare a Scribd company logo
XML-RPC 
Cao Tuấn Dũng 
Trịnh Tuấn Đạt 
1 
LẬP TRÌNH PHÂN TÁN THEO CHỦ ĐỀ
Nội dung 
1. Giới thiệu 
2. XML-RPC là gì 
3. Chương trình ví dụ 
2
1. Giới thiệu 
3 
Client 
Server 
Wieviel Uhr 
ist es? 
? 
Client và Server cần hiểu nhau.
4 
Quelle heure est-il? 
7pm! 
Ngôn ngữ chung thống nhất 
Client 
Server 
What’s the 
time? 
Wieviel Uhr 
ist es?
5 
Quelle heure est-il? 
Client mã hóa thông tin dùng “ngôn ngữ chung”, server giải mã. 
Client 
Server 
What’s the 
time? 
Wieviel Uhr 
ist es? 
Encode 
Decode
6 
Java C++ Python etc. 
XML – ngôn ngữ truyền dữ liệu chung 
Server 
XML 
Java 
C++ 
Python 
etc. 
Encode 
Decode 
Client
XML - RPC
8 
RPC 
public class Example { 
public int sum(int a, int b) { 
return a+b; 
} 
public static void main (String [] args) { 
Example eg = new Example(); 
eg.sum(13,17); 
} 
} 
Local procedure call 
[…] 
eg.sum(13,17); 
[…] 
Client 
[…] 
public int sum(int a, int b) { 
return a+b; 
} 
[…] 
Server 
Remote procedure call (RPC)
Nhắc lại về RPC 
RPC: kỹ thuật để xây dựng các ứng dụng phân tán, theo mô hình client-server. 
Là mở rộng của lời gọi thủ tục cục bộ thông thường. 
Như khái niệm “remote”, thủ tục được gọi không cần tồn tại ở cùng không gian địa chỉ với nơi gọi. 
Hai tiến trình có thể ở cùng hệ thống, hoặc ở các hệ thống khác nhau, cùng kết nối vào 1 network. 
Nhờ sử dụng RPC, lập trình các ứng dụng phân tán sẽ tránh các bước chi tiết trong lập trình mạng. 
9
2. XML-RPC: www.xmlrpc.com 
10
XML-RPC là gì? 
“Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet 
Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 
11
12 
“Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet 
Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 
Đặc tả lightweight. - <1800 từ - dễ học, có ví dụ
13 
“Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet 
Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 
Các ngôn ngữ hỗ trợ: C/C++, Java, Perl, Python, Frontier, Lisp, PHP, Microsoft .NET, Rebol, Real Basic, Tcl, Delphi, WebObjects and Zope
14 
“It's a spec and a set of implementations” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet 
Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 
Uses existing protocols (HTTP) and a well established framework (XML).
15 
“It's a spec and a set of implementations” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet 
Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 
The following data structures are supported: integer, boolean, string, double, date & time, base64 binaries, structs, arrays.
Kiến trúc ứng dụng XML-RPC 
Server gồm ba thành phần: 
main thread 
Server XML-RPC (cài đặt các stub) 
Một hoặc nhiều RPC handler 
Server xử lý mỗi RPC thông qua việc gọi các RPC handler tương ứng.
Kiến trúc ứng dụng XML-RPC 
Client 
Server 
XML-RPC 
Server 
RPC Handler 
HTTP
Kiểu dữ liệu 
Số nguyên có dấu 4-byte Boolean 
String 
Double 
Date/Time 
Binary (base-64) 
Mảng 
Cấu trúc
Thư viện 
C++: xmlrpc-c 
http://xmlrpc-c.sourceforge.net 
Java: Apache XML-RPC 
http://ws.apache.org/xmlrpc 
Yêu cầu 
http://jakarta.apache.org/commons/codec
Chế độ tương tác 
Hai kiểu 
Đồng bộ 
Không đồng bộ
Đồng bộ 
Client thực thi thủ tục trên server 
Client bị khóa cho đến khi RPC trả về kết quả 
Server trả về kiểu (đối tượng) tổng quát 
C++ (xmlrpc-c) 
xmlrpc_c::value 
Java (Apache) 
Object 
Client phải biết mình cần kiểu dữ liệu gì 
Ép kiểu
Không đồng bộ 
Client phải định nghĩa một đối tượng với 
Phương thức call-back xử lý khi RPC thành công 
Phương thức call-back xử lý khi RPC thất bại/lỗi 
Client 
Sinh một thread cho RPC 
Quay về 
Khi RPC kết thúc, một trong các phương thức call-back sẽ được gọi. 
Ép kiểu giá trị trả về
Thực hiện XML-RPC 
1. Lên danh sách tham số 
2. Khởi tạo RPC 
Tên 
URL của server 
http://address:port/RPC1 
3. Thi hành RPC 
4. Xử lý lỗi 
5. Xử lý giá trị trả về
Ví dụ: một ứng dụng XML-RPC client/server viết bằng Java. 
Gói Java org.apache.xmlrpc cung cấp các Classes để cài đặt một XML-RPC client và một XML-RPC server. 
Tìm trên: http://ws.apache.org/xmlrpc/ 
Thêm cis69mc.jar vào Classpath 
Thủ tục từ xa: thực hiện phép cộng 
24
Lên danh sách tham số 
C++ 
xmlrpc_c::paramList params; 
params.add( 
xmlrpc_c::value_string(“Hello server.”)); 
Java 
java.util.Vector params = new Vector(); 
params.add(new String(“Hello server.”));
Khởi tạo RPC 
C++ 
xmlrpc_c::clientXmlTransport_libwww xlmrpcTransport; 
xmlrpc_c::client_xml xmlrpcClient(&xmlrpcTransport); 
xmlrpc_c::rpcPtr xmlrpc(“server.sayHello”, params); 
xmlrpc_c::carriageParm_libwww0 cParm( 
“http://127.0.0.1:9382/RPC2”);
Khởi tạo RPC 
Java 
XmlRpcClient client = null; 
try { 
client = new XmlRpcClient( 
“http://127.0.0.1:9382/RPC2”); 
} catch (MalformedURLException e) { 
System.err.println(e); 
}
Thực thi (gọi) RPC 
C++ 
try { 
xmlrpc->call(&client, &cParm); 
} catch (std::exception const e) { 
cerr << “Connection refused.” << endl; 
}
Thực thi (gọi) RPC 
Java 
try { 
Object returnValue = client.execute( 
“server.sayHello”, params); 
} catch (XmlRpcException e) { 
System.err.println(e); // some RPC problem 
} catch (IOException e) { 
System.err.println(“Connection refused.”); 
}
Xử lý lỗi 
C++ 
if (xmlrpc->isSuccessful() == false) { 
if (xmlrpc->isFinished() == true) { 
xmlrpc_c::fault f = xmlrpc->getFault(); 
if (f.getCode() == 0) {…} // exception 
else {…} // unexpected error 
} 
else {…} // unexpected error 
}
Xử lý kết quả 
C++ 
if (xmlrpc->isSuccessful() == true) { 
xmlrpc_c::value v = xmlrpc->getResult(); 
xmlrpc_c::value_string rpcstr = 
(xmlrpc_c::value_string) v; 
std::string text = (std::string) rpcstr; 
}
Xử lý kết quả 
Java 
try { 
String text = (String) returnValue; 
} catch (ClassCastException e) { 
// returnValue was not a String. 
// It could have been an Exception. 
}
Xây dựng Server 
1. Định nghĩa một hay nhiều handlers 
C++: Lớp con của xmlrpc_c::method 
Java: tạo ra một lớp public mới 
2. Khởi tạo đối tượng server (cung cấp bởi thư viện) 
Chỉ định cổng 
3. Thêm handlers vào server 
4. Khởi động server 
Có thể tạo ra thread mới
Định nghĩa các Handler 
C++ 
class HelloMethod : public xmlrpc_c::method { 
public: 
void execute(xmlrpc-c::paramList const& params, xmlrpc_c::value* const retvalP) { 
*retvalP = xmlrpc_c::value_string( 
“Hello client.”); 
} 
};
Định nghĩa các Handler 
Java 
public class RPCHandler { 
// All public methods in this class are 
// RPC handlers 
public String sayHello(String param) { 
return new String(“Hello client.”); 
} 
}
Khởi tạo Server 
C++ 
xmlrpc_c::registry reg; 
xmlrpc_c::serverAbyss server; 
Java 
WebServer server = null; 
try { 
server = new WebServer(9382); 
} catch (Exception e) { 
System.err.println(e); 
}
Thêm Handler vào server 
C++ 
xmlrpc_c::methodPtr const helloMethod( 
new HelloMethod); 
reg.addMethod(“server.sayHello”, 
helloMethod); 
server = xmlrpc_c::serverAbyss(reg, 9382, 
“xmlrpc.log”);
Thêm Handler 
Java 
server.addHandler( 
“server”, 
new RPCHandler() 
);
Khởi động server 
C++ 
// Chạy trong luồng hiện tại. 
server.run(); 
Java 
// Chạy trong luông mới. 
server.start();
40 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
Java Client
41 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Gói Java org.apache.xmlrpc chứa các lớp phục vụ cho XML-RPC Java clients và XML-RPC server. Ví dụ, cho client là XmlRpcClient. 
Gói java.util sử dụng cho lớp Vector.
42 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client
43 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Dòng lệnh này sẽ gửi request đến server. Thủ tục sum(17,13) được gọi trên server như một thủ tục cục bộ. Giá trị trả về luôn là một Object. 
“sample” là một handler được định nghĩa trên server.
44 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Dòng lệnh này sẽ gửi request đến server. Thủ tục sum(17,13) được gọi trên server như một thủ tục cục bộ. Giá trị trả về luôn là một Object. 
“sample” là một handler được định nghĩa trên server. 
Các tham số của thủ tục gọi luôn luôn đặt trong Vector.
45 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Đối tượng lớp XmlRpcClient được khởi tạo bằng cách chỉ ra “web address” của máy server. 
localhost - chỉ ra máy cục bộ. 
Địa chỉ IP, ví dụ: 194.80.215.219 
Tên, ví dụ: cis69.dyndns.org 
Trong tất cả các trườnghợp trên, theo sau là một số hiệu cổng, ví dụ: cis69.dyndns.org:8080. mặc định là cổng 80.
46 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Vì kết quả của lời gọi thủ tục từ xa luôn là một Object, nên nó phải được ép về kiểu thích hợp. (Trường hợp này là Integer)
47 
import java.util.*; 
import org.apache.xmlrpc.*; 
public class JavaClient { 
public static void main (String [] args) { 
try { 
XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); 
Vector params = new Vector(); 
params.addElement(new Integer(17)); 
params.addElement(new Integer(13)); 
Object result = server.execute("sample.sum", params); 
int sum = ((Integer) result).intValue(); 
System.out.println("The sum is: "+sum); 
} catch (Exception exception) { 
System.err.println("JavaClient: " + exception); 
} 
} 
} 
A Java Client 
Khi có lỗi(không có kết nối, …), xử lý với try- catch.
48 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<methodCall> 
<methodName>sample.sum</methodName> 
<params> 
<param> 
<value><int>17</int></value> 
</param> 
<param> 
<value><int>13</int></value> 
</param> 
</params> 
</methodCall> 
Client Server 
Đây là những gì Client gửi cho server.
49 
import org.apache.xmlrpc.*; 
public class JavaServer { 
public Integer sum(int x, int y) { 
return new Integer(x+y); 
} 
public static void main (String [] args) { 
try { 
WebServer server = new WebServer(80); 
server.addHandler("sample", new JavaServer()); 
server.start(); 
} catch (Exception exception) { 
System.err.println("JavaServer: " + exception); 
} 
} 
} 
Java Server
50 
import org.apache.xmlrpc.*; 
public class JavaServer { 
public Integer sum(int x, int y) { 
return new Integer(x+y); 
} 
public static void main (String [] args) { 
try { 
WebServer server = new WebServer(80); 
server.addHandler("sample", new JavaServer()); 
server.start(); 
} catch (Exception exception) { 
System.err.println("JavaServer: " + exception); 
} 
} 
} 
A Java Server 
Gói org.apache.xmlrpc chứa lớp WebServer để cài đặt một XML-RPC Server
51 
import org.apache.xmlrpc.*; 
public class JavaServer { 
public Integer sum(int x, int y) { 
return new Integer(x+y); 
} 
public static void main (String [] args) { 
try { 
WebServer server = new WebServer(80); 
server.addHandler("sample", new JavaServer()); 
server.start(); 
} catch (Exception exception) { 
System.err.println("JavaServer: " + exception); 
} 
} 
} 
A Java Server 
Thủ tục được gọi từ xa phải được cài đặt là 1 phương thức public trong 1 class 
Một thể hiện của lớp này được kết hợp với một handler truy cập được từ client.
52 
import org.apache.xmlrpc.*; 
public class JavaServer { 
public Integer sum(int x, int y) { 
return new Integer(x+y); 
} 
public static void main (String [] args) { 
try { 
WebServer server = new WebServer(80); 
server.addHandler("sample", new JavaServer()); 
server.start(); 
} catch (Exception exception) { 
System.err.println("JavaServer: " + exception); 
} 
} 
} 
A Java Server 
Đối tượng lớp WebServer được khởi tạo với số hiệu cổng (ở đây là: 80). 
Server bắt đầu lắng nghe ở cổng 80.
53 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<methodResponse> 
<params> 
<param> 
<value><int>30</int></value> 
</param> 
</params> 
</methodResponse> 
Client Server

More Related Content

What's hot

19 web server
19  web server19  web server
19 web serverCơn Gió
 
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Levis Nickaster
 
Introduction ns2
Introduction ns2Introduction ns2
Introduction ns2Tien Quan
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Linh Nguyen
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Levis Nickaster
 
Postgresql các vấn đề thực tế
Postgresql các vấn đề thực tếPostgresql các vấn đề thực tế
Postgresql các vấn đề thực tế
TechMaster Vietnam
 
Lab 2 phân loại dùng mô hình mqc
Lab 2 phân loại dùng mô hình mqcLab 2 phân loại dùng mô hình mqc
Lab 2 phân loại dùng mô hình mqc
VNG
 
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịchHướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Levis Nickaster
 
File inclusion attack(nop thay)
File inclusion attack(nop thay)File inclusion attack(nop thay)
File inclusion attack(nop thay)
phanleson
 
Lt socket
Lt socketLt socket
Lt socket
Hung Pham
 
Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879Son Giap
 
JavaEE Basic_Chapter4: Servlet Nâng Cao
JavaEE Basic_Chapter4: Servlet Nâng CaoJavaEE Basic_Chapter4: Servlet Nâng Cao
JavaEE Basic_Chapter4: Servlet Nâng Cao
Phaolo Pham
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Levis Nickaster
 
Báo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh TuấnBáo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh TuấnHuỳnh Tuấn
 
Bài giảng Lập trình mạng
Bài giảng Lập trình mạngBài giảng Lập trình mạng
Bài giảng Lập trình mạngctrl man
 
Tìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệmTìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệm
tienhien110293
 
Hacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịchHacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịch
Levis Nickaster
 
Linux+04
Linux+04Linux+04
Linux+04
Duong Hieu
 

What's hot (20)

19 web server
19  web server19  web server
19 web server
 
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
 
Introduction ns2
Introduction ns2Introduction ns2
Introduction ns2
 
Baigiang Ns2
Baigiang Ns2Baigiang Ns2
Baigiang Ns2
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
 
Postgresql các vấn đề thực tế
Postgresql các vấn đề thực tếPostgresql các vấn đề thực tế
Postgresql các vấn đề thực tế
 
Lab 2 phân loại dùng mô hình mqc
Lab 2 phân loại dùng mô hình mqcLab 2 phân loại dùng mô hình mqc
Lab 2 phân loại dùng mô hình mqc
 
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịchHướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
 
File inclusion attack(nop thay)
File inclusion attack(nop thay)File inclusion attack(nop thay)
File inclusion attack(nop thay)
 
Lt socket
Lt socketLt socket
Lt socket
 
Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879
 
JavaEE Basic_Chapter4: Servlet Nâng Cao
JavaEE Basic_Chapter4: Servlet Nâng CaoJavaEE Basic_Chapter4: Servlet Nâng Cao
JavaEE Basic_Chapter4: Servlet Nâng Cao
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
 
Báo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh TuấnBáo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh Tuấn
 
Bài giảng Lập trình mạng
Bài giảng Lập trình mạngBài giảng Lập trình mạng
Bài giảng Lập trình mạng
 
File trong c_
File trong c_File trong c_
File trong c_
 
Tìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệmTìm hiểu đầy đủ về tràn bộ đệm
Tìm hiểu đầy đủ về tràn bộ đệm
 
Hacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịchHacking de4dot for fun - Bài dịch
Hacking de4dot for fun - Bài dịch
 
Linux+04
Linux+04Linux+04
Linux+04
 

Viewers also liked

Cập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbCập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbANHMATTROI
 
Cap nhat CSDL trong VB.NET
Cap nhat CSDL trong VB.NETCap nhat CSDL trong VB.NET
Cap nhat CSDL trong VB.NETANHMATTROI
 
Auto lisp programming
Auto lisp programmingAuto lisp programming
Auto lisp programming
Jos van Doorn
 
AC 2013 AutoLISP Developers_guide
AC 2013 AutoLISP Developers_guideAC 2013 AutoLISP Developers_guide
AC 2013 AutoLISP Developers_guideArun Talukdar
 
Tài liệu tự học Auto lisp
Tài liệu tự học Auto lispTài liệu tự học Auto lisp
Tài liệu tự học Auto lispTrung Thanh Nguyen
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
MasterCode.vn
 
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
MasterCode.vn
 
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
MasterCode.vn
 

Viewers also liked (9)

Learn CAD Customization
Learn CAD CustomizationLearn CAD Customization
Learn CAD Customization
 
Cập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbCập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vb
 
Cap nhat CSDL trong VB.NET
Cap nhat CSDL trong VB.NETCap nhat CSDL trong VB.NET
Cap nhat CSDL trong VB.NET
 
Auto lisp programming
Auto lisp programmingAuto lisp programming
Auto lisp programming
 
AC 2013 AutoLISP Developers_guide
AC 2013 AutoLISP Developers_guideAC 2013 AutoLISP Developers_guide
AC 2013 AutoLISP Developers_guide
 
Tài liệu tự học Auto lisp
Tài liệu tự học Auto lispTài liệu tự học Auto lisp
Tài liệu tự học Auto lisp
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
 
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
 
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theoBài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 1: Làm quen với ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
 

Similar to Dsd05 02a-xml-rpca

Dsd05 02b-json-rpca
Dsd05 02b-json-rpcaDsd05 02b-json-rpca
Dsd05 02b-json-rpca
Văn Đào Tiến
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#Dao Uit
 
Technical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vnTechnical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vn
Asahina Infotech
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biến
Son Nguyen
 
Node.js căn bản
Node.js căn bảnNode.js căn bản
Node.js căn bản
TechMaster Vietnam
 
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdfBai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
CanhPhuongVan
 
Asp
AspAsp
Asp
thinhtu
 
ChatMessenger
ChatMessengerChatMessenger
ChatMessenger
Diên Vĩ
 
Vhdl
VhdlVhdl
Vhdl
lionking
 
Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952
Ham Chơi
 
Tổng hợp nè
Tổng hợp nèTổng hợp nè
Tổng hợp nè
Nguyễn Hiền
 
Net06 asp.net applications & state management
Net06 asp.net applications & state managementNet06 asp.net applications & state management
Net06 asp.net applications & state management
hoangnguyentien
 
Webservice
WebserviceWebservice
De cuongthuchanhct221 hk2_1920_n1
De cuongthuchanhct221 hk2_1920_n1De cuongthuchanhct221 hk2_1920_n1
De cuongthuchanhct221 hk2_1920_n1
Nahudi Nguyễn
 
Web Architecture
Web ArchitectureWeb Architecture
Web Architecture
Hiep Luong
 

Similar to Dsd05 02a-xml-rpca (20)

Dsd05 02b-json-rpca
Dsd05 02b-json-rpcaDsd05 02b-json-rpca
Dsd05 02b-json-rpca
 
Dsd05 01-rpca
Dsd05 01-rpcaDsd05 01-rpca
Dsd05 01-rpca
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
 
Technical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vnTechnical note playframework_documentation_working with play - java_vn
Technical note playframework_documentation_working with play - java_vn
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biến
 
Node.js căn bản
Node.js căn bảnNode.js căn bản
Node.js căn bản
 
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdfBai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
Bai giang-Lap trinh he thong-Ch2-Lap trinh Socket.pdf
 
Asp
AspAsp
Asp
 
ChatMessenger
ChatMessengerChatMessenger
ChatMessenger
 
Phan 1 sv
Phan 1   svPhan 1   sv
Phan 1 sv
 
Dsd05 03-rmia
Dsd05 03-rmiaDsd05 03-rmia
Dsd05 03-rmia
 
Ch06
Ch06Ch06
Ch06
 
Vhdl
VhdlVhdl
Vhdl
 
Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952Bai1 gioi thieu_servlet_va_jsp_8952
Bai1 gioi thieu_servlet_va_jsp_8952
 
Tổng hợp nè
Tổng hợp nèTổng hợp nè
Tổng hợp nè
 
Net06 asp.net applications & state management
Net06 asp.net applications & state managementNet06 asp.net applications & state management
Net06 asp.net applications & state management
 
Ung dun web chuong 2
Ung dun web  chuong 2Ung dun web  chuong 2
Ung dun web chuong 2
 
Webservice
WebserviceWebservice
Webservice
 
De cuongthuchanhct221 hk2_1920_n1
De cuongthuchanhct221 hk2_1920_n1De cuongthuchanhct221 hk2_1920_n1
De cuongthuchanhct221 hk2_1920_n1
 
Web Architecture
Web ArchitectureWeb Architecture
Web Architecture
 

Dsd05 02a-xml-rpca

  • 1. XML-RPC Cao Tuấn Dũng Trịnh Tuấn Đạt 1 LẬP TRÌNH PHÂN TÁN THEO CHỦ ĐỀ
  • 2. Nội dung 1. Giới thiệu 2. XML-RPC là gì 3. Chương trình ví dụ 2
  • 3. 1. Giới thiệu 3 Client Server Wieviel Uhr ist es? ? Client và Server cần hiểu nhau.
  • 4. 4 Quelle heure est-il? 7pm! Ngôn ngữ chung thống nhất Client Server What’s the time? Wieviel Uhr ist es?
  • 5. 5 Quelle heure est-il? Client mã hóa thông tin dùng “ngôn ngữ chung”, server giải mã. Client Server What’s the time? Wieviel Uhr ist es? Encode Decode
  • 6. 6 Java C++ Python etc. XML – ngôn ngữ truyền dữ liệu chung Server XML Java C++ Python etc. Encode Decode Client
  • 8. 8 RPC public class Example { public int sum(int a, int b) { return a+b; } public static void main (String [] args) { Example eg = new Example(); eg.sum(13,17); } } Local procedure call […] eg.sum(13,17); […] Client […] public int sum(int a, int b) { return a+b; } […] Server Remote procedure call (RPC)
  • 9. Nhắc lại về RPC RPC: kỹ thuật để xây dựng các ứng dụng phân tán, theo mô hình client-server. Là mở rộng của lời gọi thủ tục cục bộ thông thường. Như khái niệm “remote”, thủ tục được gọi không cần tồn tại ở cùng không gian địa chỉ với nơi gọi. Hai tiến trình có thể ở cùng hệ thống, hoặc ở các hệ thống khác nhau, cùng kết nối vào 1 network. Nhờ sử dụng RPC, lập trình các ứng dụng phân tán sẽ tránh các bước chi tiết trong lập trình mạng. 9
  • 11. XML-RPC là gì? “Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. 11
  • 12. 12 “Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. Đặc tả lightweight. - <1800 từ - dễ học, có ví dụ
  • 13. 13 “Đặc tả và tập các cài đặt” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. Các ngôn ngữ hỗ trợ: C/C++, Java, Perl, Python, Frontier, Lisp, PHP, Microsoft .NET, Rebol, Real Basic, Tcl, Delphi, WebObjects and Zope
  • 14. 14 “It's a spec and a set of implementations” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. Uses existing protocols (HTTP) and a well established framework (XML).
  • 15. 15 “It's a spec and a set of implementations” cho phép phần mềm chạy trên các hệ điều hành khác nhau, chạy trên các môi trường khác nhau, tạo ra các lời gọi thủ tục trên toàn mạng Internet Là lời gọi thủ tục từ xa sử dụng giao thức HTTP và XML để mã hóa. XML-RPC được thiết kế đơn giản nhất có thể, nhưng có thể truyền đi, xử lý, trả về các cấu trúc dữ liệu phức tạp. The following data structures are supported: integer, boolean, string, double, date & time, base64 binaries, structs, arrays.
  • 16. Kiến trúc ứng dụng XML-RPC Server gồm ba thành phần: main thread Server XML-RPC (cài đặt các stub) Một hoặc nhiều RPC handler Server xử lý mỗi RPC thông qua việc gọi các RPC handler tương ứng.
  • 17. Kiến trúc ứng dụng XML-RPC Client Server XML-RPC Server RPC Handler HTTP
  • 18. Kiểu dữ liệu Số nguyên có dấu 4-byte Boolean String Double Date/Time Binary (base-64) Mảng Cấu trúc
  • 19. Thư viện C++: xmlrpc-c http://xmlrpc-c.sourceforge.net Java: Apache XML-RPC http://ws.apache.org/xmlrpc Yêu cầu http://jakarta.apache.org/commons/codec
  • 20. Chế độ tương tác Hai kiểu Đồng bộ Không đồng bộ
  • 21. Đồng bộ Client thực thi thủ tục trên server Client bị khóa cho đến khi RPC trả về kết quả Server trả về kiểu (đối tượng) tổng quát C++ (xmlrpc-c) xmlrpc_c::value Java (Apache) Object Client phải biết mình cần kiểu dữ liệu gì Ép kiểu
  • 22. Không đồng bộ Client phải định nghĩa một đối tượng với Phương thức call-back xử lý khi RPC thành công Phương thức call-back xử lý khi RPC thất bại/lỗi Client Sinh một thread cho RPC Quay về Khi RPC kết thúc, một trong các phương thức call-back sẽ được gọi. Ép kiểu giá trị trả về
  • 23. Thực hiện XML-RPC 1. Lên danh sách tham số 2. Khởi tạo RPC Tên URL của server http://address:port/RPC1 3. Thi hành RPC 4. Xử lý lỗi 5. Xử lý giá trị trả về
  • 24. Ví dụ: một ứng dụng XML-RPC client/server viết bằng Java. Gói Java org.apache.xmlrpc cung cấp các Classes để cài đặt một XML-RPC client và một XML-RPC server. Tìm trên: http://ws.apache.org/xmlrpc/ Thêm cis69mc.jar vào Classpath Thủ tục từ xa: thực hiện phép cộng 24
  • 25. Lên danh sách tham số C++ xmlrpc_c::paramList params; params.add( xmlrpc_c::value_string(“Hello server.”)); Java java.util.Vector params = new Vector(); params.add(new String(“Hello server.”));
  • 26. Khởi tạo RPC C++ xmlrpc_c::clientXmlTransport_libwww xlmrpcTransport; xmlrpc_c::client_xml xmlrpcClient(&xmlrpcTransport); xmlrpc_c::rpcPtr xmlrpc(“server.sayHello”, params); xmlrpc_c::carriageParm_libwww0 cParm( “http://127.0.0.1:9382/RPC2”);
  • 27. Khởi tạo RPC Java XmlRpcClient client = null; try { client = new XmlRpcClient( “http://127.0.0.1:9382/RPC2”); } catch (MalformedURLException e) { System.err.println(e); }
  • 28. Thực thi (gọi) RPC C++ try { xmlrpc->call(&client, &cParm); } catch (std::exception const e) { cerr << “Connection refused.” << endl; }
  • 29. Thực thi (gọi) RPC Java try { Object returnValue = client.execute( “server.sayHello”, params); } catch (XmlRpcException e) { System.err.println(e); // some RPC problem } catch (IOException e) { System.err.println(“Connection refused.”); }
  • 30. Xử lý lỗi C++ if (xmlrpc->isSuccessful() == false) { if (xmlrpc->isFinished() == true) { xmlrpc_c::fault f = xmlrpc->getFault(); if (f.getCode() == 0) {…} // exception else {…} // unexpected error } else {…} // unexpected error }
  • 31. Xử lý kết quả C++ if (xmlrpc->isSuccessful() == true) { xmlrpc_c::value v = xmlrpc->getResult(); xmlrpc_c::value_string rpcstr = (xmlrpc_c::value_string) v; std::string text = (std::string) rpcstr; }
  • 32. Xử lý kết quả Java try { String text = (String) returnValue; } catch (ClassCastException e) { // returnValue was not a String. // It could have been an Exception. }
  • 33. Xây dựng Server 1. Định nghĩa một hay nhiều handlers C++: Lớp con của xmlrpc_c::method Java: tạo ra một lớp public mới 2. Khởi tạo đối tượng server (cung cấp bởi thư viện) Chỉ định cổng 3. Thêm handlers vào server 4. Khởi động server Có thể tạo ra thread mới
  • 34. Định nghĩa các Handler C++ class HelloMethod : public xmlrpc_c::method { public: void execute(xmlrpc-c::paramList const& params, xmlrpc_c::value* const retvalP) { *retvalP = xmlrpc_c::value_string( “Hello client.”); } };
  • 35. Định nghĩa các Handler Java public class RPCHandler { // All public methods in this class are // RPC handlers public String sayHello(String param) { return new String(“Hello client.”); } }
  • 36. Khởi tạo Server C++ xmlrpc_c::registry reg; xmlrpc_c::serverAbyss server; Java WebServer server = null; try { server = new WebServer(9382); } catch (Exception e) { System.err.println(e); }
  • 37. Thêm Handler vào server C++ xmlrpc_c::methodPtr const helloMethod( new HelloMethod); reg.addMethod(“server.sayHello”, helloMethod); server = xmlrpc_c::serverAbyss(reg, 9382, “xmlrpc.log”);
  • 38. Thêm Handler Java server.addHandler( “server”, new RPCHandler() );
  • 39. Khởi động server C++ // Chạy trong luồng hiện tại. server.run(); Java // Chạy trong luông mới. server.start();
  • 40. 40 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } Java Client
  • 41. 41 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Gói Java org.apache.xmlrpc chứa các lớp phục vụ cho XML-RPC Java clients và XML-RPC server. Ví dụ, cho client là XmlRpcClient. Gói java.util sử dụng cho lớp Vector.
  • 42. 42 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client
  • 43. 43 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Dòng lệnh này sẽ gửi request đến server. Thủ tục sum(17,13) được gọi trên server như một thủ tục cục bộ. Giá trị trả về luôn là một Object. “sample” là một handler được định nghĩa trên server.
  • 44. 44 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Dòng lệnh này sẽ gửi request đến server. Thủ tục sum(17,13) được gọi trên server như một thủ tục cục bộ. Giá trị trả về luôn là một Object. “sample” là một handler được định nghĩa trên server. Các tham số của thủ tục gọi luôn luôn đặt trong Vector.
  • 45. 45 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Đối tượng lớp XmlRpcClient được khởi tạo bằng cách chỉ ra “web address” của máy server. localhost - chỉ ra máy cục bộ. Địa chỉ IP, ví dụ: 194.80.215.219 Tên, ví dụ: cis69.dyndns.org Trong tất cả các trườnghợp trên, theo sau là một số hiệu cổng, ví dụ: cis69.dyndns.org:8080. mặc định là cổng 80.
  • 46. 46 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Vì kết quả của lời gọi thủ tục từ xa luôn là một Object, nên nó phải được ép về kiểu thích hợp. (Trường hợp này là Integer)
  • 47. 47 import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient server = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } } A Java Client Khi có lỗi(không có kết nối, …), xử lý với try- catch.
  • 48. 48 <?xml version="1.0" encoding="ISO-8859-1"?> <methodCall> <methodName>sample.sum</methodName> <params> <param> <value><int>17</int></value> </param> <param> <value><int>13</int></value> </param> </params> </methodCall> Client Server Đây là những gì Client gửi cho server.
  • 49. 49 import org.apache.xmlrpc.*; public class JavaServer { public Integer sum(int x, int y) { return new Integer(x+y); } public static void main (String [] args) { try { WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } } Java Server
  • 50. 50 import org.apache.xmlrpc.*; public class JavaServer { public Integer sum(int x, int y) { return new Integer(x+y); } public static void main (String [] args) { try { WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } } A Java Server Gói org.apache.xmlrpc chứa lớp WebServer để cài đặt một XML-RPC Server
  • 51. 51 import org.apache.xmlrpc.*; public class JavaServer { public Integer sum(int x, int y) { return new Integer(x+y); } public static void main (String [] args) { try { WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } } A Java Server Thủ tục được gọi từ xa phải được cài đặt là 1 phương thức public trong 1 class Một thể hiện của lớp này được kết hợp với một handler truy cập được từ client.
  • 52. 52 import org.apache.xmlrpc.*; public class JavaServer { public Integer sum(int x, int y) { return new Integer(x+y); } public static void main (String [] args) { try { WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } } A Java Server Đối tượng lớp WebServer được khởi tạo với số hiệu cổng (ở đây là: 80). Server bắt đầu lắng nghe ở cổng 80.
  • 53. 53 <?xml version="1.0" encoding="ISO-8859-1"?> <methodResponse> <params> <param> <value><int>30</int></value> </param> </params> </methodResponse> Client Server