Cài đặt lớp giao diện HelloInterface.java /* Buoc 1 : Dac ta giao tiep cho lop doi tuong o xa */ import java.rmi.*; public interface HelloInterface extends java.rmi.Remote { public Str
Trang 1MỤC LỤC
Bài 1 LẬP TRÌNH PHÂN TÁN ĐỐI TƯỢNG JAVA RMI 2
1.1 Chương trình RMI Hello 2
1.1.1 Cài đặt lớp giao diện HelloInterface.java 2
1.1.2 Cài đặt lớp hiện thực HelloImpl.java 2
1.1.3 Cài đặt chương trình Server : HelloServer.java 2
1.1.4 Cài đặt chương trình Client : HelloClient java 3
1.1.5 Biên dịch chương trình 3
1.2 Chương trình RMI truy xuất cơ sở dữ liệu từ xa 5
1.2.1 Xây dựng cơ sở dữ liệu 5
1.2.2 Xây dựng lớp DBServerInterface.java 5
1.2.3 Xây dựng lớp DBServerImpl.java 5
1.2.4 Xây dựng lớp DBServer.java 6
1.2.5 Xây dựng lớp DBClient.java 7
1.3 Chương trình minh họa kỹ thuật gọi ngược (callback) trên RMI 7
1.3.1 Xây dựng lớp AtServerInterface.java 7
1.3.2 Xây dựng lớp AtServerImpl.java 7
1.3.3 Xây dựng chương trình AtClientInterface.java 8
1.3.4 Xây dựng chương trình AtClientImpl.java 8
1.3.5 Xây dựng chương trình Server.java 8
1.3.6 Chương trình Client.java 8
Bài 2 LẬP TRÌNH PHÂN TÁN ĐỐI TƯỢNG CORBA 11
2.1 Chương trình CORBA Hello 11
2.1.1 Bước 1 : Đặc tả đối tượng bằng ngôn ngữ CORBA IDL 11
2.1.2 Bước 2 : Xây dựng đối tượng Hello bằng ngôn ngữ Java 11
2.1.3 Bước 3 : Cài đặt đối tượng CORBA Hello 11
2.1.4 Bước 4 : Xây dựng chương trình Server 11
2.1.5 Bước 5 : Xây dựng chương trình Client 12
2.1.6 Chạy chương trình 13
Trang 2Bài 1 LẬP TRÌNH PHÂN TÁN ĐỐI TƯỢNG JAVA RMI
1.1 Chương trình RMI Hello
- Xây dựng chương trình JavaRMI, client gởi yêu cầu add(x,y), sub(x,y) đến Server Server thực hiện và trả kết quả về cho client
1.1.1 Cài đặt lớp giao diện HelloInterface.java
/* Buoc 1 : Dac ta giao tiep cho lop doi tuong o xa
*/
import java.rmi.*;
public interface HelloInterface extends java.rmi.Remote {
public String sayHello() throws java.rmi.RemoteException;
public int addItem(int x, int y) throws java.rmi.RemoteException;
public int subItem(int x, int y) throws java.rmi.RemoteException;
}//class
1.1.2 Cài đặt lớp hiện thực HelloImpl.java
- Cài đặt chi tiết các phương thức được mô tả trong lớp giao diện
/* Buoc 2 : Cai dat chi tiet phuong thuc tu xa
*/
import java.rmi.*;
public class HelloImpl implements HelloInterface {
public String sayHello() throws java.rmi.RemoteException {
System.out.println("Client da su dung phuong thuc 1 cua Server");
return "Hello World";
}//sayHello()
public int addItem(int x, int y) throws java.rmi.RemoteException {
return (x+y);
}//addItem()
public int subItem(int x, int y) throws java.rmi.RemoteException {
return (x-y);
}//subItem()
}//class
1.1.3 Cài đặt chương trình Server : HelloServer.java
/* Buoc 3 : Khoi tao doi tuong giao tiep tren may chu
*/
import java.rmi.*;
import java.rmi.server.*;
public class HelloServer {
public static void main (String args[]) throws java.lang.Exception {
//Kien tao doi tuong
try {
//Kien tao doi tuong
HelloImpl obj = new HelloImpl();
Trang 3//Khai bao doi tuong voi may ao JVM
java.rmi.server.UnicastRemoteObject.exportObject(obj);
System.out.println("* Dang ky doi tuong");
java.rmi.Naming.bind("rmi://127.0.0.1/HelloImpl",obj);
System.out.println("* Dang ky doi tuong cho phep truy xuat tu xa : HelloImpl");
System.out.println("* Cho Client truy xuat ");
}catch (java.lang.Exception ex){System.out.println(ex);}
}//main
}//class
Chú ý : có thể gộp chương trình HelloRMIServer.java và HelloImplement.java vào
1 chương trình nhưng phức tạp
1.1.4 Cài đặt chương trình Client : HelloClient java
/* Buoc 4 : Chuong trinh goi doi tuong tu xa
*/
import java.rmi.*;
public class HelloClient {
public static void main (String[] args) {
int x = 5;
int y = 3;
try {
//Tim tham chieu cua doi tuong
System.out.println("Dang tim doi tuong ");
HelloInterface obj=(HelloInterface)java.rmi.Naming.lookup("rmi://"+ args[0]
+"/HelloImpl");
//Trieu goi cac phuong thuc xu ly cua doi tuong tu xa
System.out.println(obj.sayHello());
System.out.println("* Tong = " + obj.addItem(x,y));
System.out.println("* Hieu = " + obj.subItem(x,y));
} catch (java.lang.Exception ex){System.out.println(ex); }
}
}
1.1.5 Biên dịch chương trình
• Tập tin Compiler
ECHO OFF
Echo -
Echo CHUONG TRINH COMPILE
Echo -
Path=C:\jdk1.4\bin
Echo -Dich cac tap tin *.java -
del *.class
javac *.java
Echo -Tao tap tin trung gian _Stub va _Skel cho doi tuong -
rmic HelloImplement
Pause
Trang 4• Tập tin Client.bat
ECHO OFF
Echo -
Echo CHUONG TRINH RMI CLIENT
Echo -
Path=C:\jdk1.4\bin
set CLASSPATH=.;%CLASSPATH%;
java HelloRMIClient 127.0.0.1
Pause
• Tập tin Server.bat
ECHO OFF
Echo -
Echo CHUONG TRINH RMI SERVER
Echo -
Path=C:\jdk1.4\bin
set CLASSPATH=.;%CLASSPATH%;
Echo -Chay chuong trinh RMIRegistry -
rmiregistry
Echo -Chay chuong trinh Server dang ky doi tuong -
java HelloRMIServer 127.0.0.1
Pause
• Tổ chức các chương trình
CLIENT SERVER
HelloRMIClient.class
HelloInterface.class
HelloImplement_STUB.class
HelloRMIServer.class
HelloImplement_SKEL.class
• Thứ tự chạy chương trình :
1 Compiler.bat
2 Serber.bat
3 Client.bat
Trang 51.2 Chương trình RMI truy xuất cơ sở dữ liệu từ xa
1.2.1 Xây dựng cơ sở dữ liệu
1.2.2 Xây dựng lớp DBServerInterface.java
import java.rmi.*;
public interface DBServerInterface extends Remote {
public String queryDataBase() throws RemoteException;
}
1.2.3 Xây dựng lớp DBServerImpl.java
import java.sql.*;
import java.rmi.*;
import java.io.*;
public class DBServerImpl implements DBServerInterface {
public DBServerImpl() { }
// -
public String queryDataBase() throws RemoteException {
return accessDB();
}
// -
public String accessDB() {
String stResult=" ";
Trang 6try {
//init database
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection connection = DriverManager.getConnection("jdbc:odbc:TAIKHOAN");
Statement statement= connection.createStatement();
boolean hasResult = statement.execute("SELECT * FROM USER");
if (hasResult) {
ResultSet rs= statement.getResultSet();
if (rs != null)
stResult= formatResult(rs);
} else
System.out.println("Khong tim duoc CSDL");
connection.close();
} catch(Exception ex)
{
System.out.println(ex.toString());
}
return stResult;
}
// -
public String formatResult(ResultSet r) throws SQLException
{
ResultSetMetaData rmeta= r.getMetaData();
int numColumns = rmeta.getColumnCount();
String text=" ";
for(int i=1;i<= numColumns; ++i){
if (i<numColumns)
text += rmeta.getColumnName(i) + "|";
else text += rmeta.getColumnName(i);
}
text += "\n";
while (r.next()){
for(int i=1; i<=numColumns;++i){
if(i<numColumns)
text += r.getString(i)+" | "; else
text += r.getString(i).trim();
} text +="\n";
} return text;
} }//class
1.2.4 Xây dựng lớp DBServer.java
import java.rmi.*;
import java.rmi.server.*;
public class DBServer {
Trang 7public static void main(String args[]) throws Exception {
DBServerImpl data = new DBServerImpl();
UnicastRemoteObject.exportObject(data);
Naming.bind("rmi://" + args[0] + "/myDatabase",data);
System.out.println("Waiting for Client request:");
}
}
1.2.5 Xây dựng lớp DBClient.java
import java.rmi.*;
import java.sql.*;
import java.rmi.server.*;
public class DBClient {
static String result;
// -Method main -
public static void main(String args[]) throws Exception {
try {
DBServerInterface objDB =
(DBServerInterface)Naming.lookup("rmi://" + args[0] + "/myDatabase"); result = objDB.queryDataBase();
}
catch(Exception e) {
System.out.println("Error Find!"+e.toString());
}
System.out.println(result);
}
} // -Ket thuc CT Client -
1.3 Chương trình minh họa kỹ thuật gọi ngược (callback) trên RMI
1.3.1 Xây dựng lớp AtServerInterface.java
import java.rmi.*;
public interface AtServerInterface extends Remote {
public void registerClient(AtClientInterface c) throws java.rmi.RemoteException;
public void callServerMethod(String message) throws java.rmi.RemoteException; }
1.3.2 Xây dựng lớp AtServerImpl.java
import java.rmi.*;
import java.io.*;
public class AtServerImpl implements AtServerInterface {
AtClientInterface client;
public void registerClient(AtClientInterface client) throws java.rmi.RemoteException {
this.client=client;
}
public void callServerMethod(String msg) throws java.rmi.RemoteException
{
Trang 8System.out.println(msg);
for (int i=1; i<10; i++){
String st= "Server response "+ Math.random()*1000;
client.callClientMethod(st);
}//for
}
}//class
1.3.3 Xây dựng chương trình AtClientInterface.java
import java.rmi.*;
public interface AtClientInterface extends java.rmi.Remote {
public void callClientMethod(String msg) throws java.rmi.RemoteException;
}
1.3.4 Xây dựng chương trình AtClientImpl.java
import java.rmi.*;
public class AtClientImpl implements AtClientInterface {
public void callClientMethod(String msg) throws java.rmi.RemoteException
{
System.out.println(msg);
}
}
1.3.5 Xây dựng chương trình Server.java
import java.rmi.*;
import java.rmi.server.*;
public class Server {
public static void main (String args[]) throws java.lang.Exception {
AtServerInterface server=new AtServerImpl();
java.rmi.server.UnicastRemoteObject.exportObject(server);
java.rmi.Naming.bind("rmi://127.0.0.1/serverobject",server);
System.out.println("Waiting for client request ");
}
}
1.3.6 Chương trình Client.java
import java.rmi.*;
import java.rmi.server.*;
public class Client {
public static void main (String args[]) throws java.lang.Exception {
AtClientInterface client=new AtClientImpl();
java.rmi.server.UnicastRemoteObject.exportObject(client);
AtServerInterface server=(AtServerInterface)java.rmi.Naming.lookup("rmi://" + args[0] +
"/serverobject");
// Dang ky doi tuong client voi RMI Registry
server.registerClient(client);
server.callServerMethod("Client contact Server");
}//main
Trang 9}//class
-
Trang 10BÀI TẬP
1 Xây dựng chương trình Client ở dạng giao diện đồ họa, cho phép nhập vào 2 giá trị x,y trên textbox Thực hiện gửi dữ liệu đến Server và nhận kết quả tính toán, hiển thị tại Client
2 Xây dựng chương trình RMIClient dùng phương thức invoke() để triệu gọi đối tượng từ xa
3 Viết chương trình RMI gồm Client, Server sử dụng các kỹ thuật truy cập CSDL và kỹ thuật gọi ngược, trong đó :
- Các Client đăng nhập vào Server theo tài khoản
- Server lưu chỉ số ID của các Client
- Server phân chia các công việc xử lý cho các Client có tên trong danh sách
đã đăng ký
- Client xử lý và trả kết quả về Server
- Server tổng hợp và hiển thị kết quả
Trang 11Bài 2 LẬP TRÌNH PHÂN TÁN ĐỐI TƯỢNG CORBA
2.1 Chương trình CORBA Hello
Xây dựng chương trình Hello minh họa các bước thực hiện một chương trình CORBA đơn giản, Client sẽ gọi đối tượng phân tán trên Server Đối tượng CORBA trên Server sẽ trả về chuỗi thông báo.cho Client
2.1.1 Bước 1 : Đặc tả đối tượng bằng ngôn ngữ CORBA IDL
(Interface Description Language)
• File Hello.idl
interface Hello {
string sayHello();
};
2.1.2 Bước 2 : Xây dựng đối tượng Hello bằng ngôn ngữ Java
Sử dụng chương trình idlj.exe để chuyển đặc tả của CORBA sang ngôn ngữ Java Chuyển đặc tả đối tượng CORBA sang ngôn ngữ Java cho Server
idlj -fserver -OldImplBase Hello.idl
Chuyển đặc tả đối tượng CORBA sang ngôn ngữ Java cho Client
idlj -fclient Hello.idl
Kết quả được các file sau :
HelloOperations.java
Hello.java
_HelloImplBase.java
HelloHelper.java
HelloHolder.java
_HelloStub.java
2.1.3 Bước 3 : Cài đặt đối tượng CORBA Hello
• File HelloImpl.java
public class HelloImpl extends _HelloImplBase {
public String sayHello(){
System.out.println("Hello world !");
return "Hello CORBA";
}
}//class
2.1.4 Bước 4 : Xây dựng chương trình Server
• File Server.java
import org.omg.CORBA.*; // All CORBA applications need these classes
import org.omg.CosNaming.*; // Client will use the naming service
Trang 12import org.omg.CosNaming.NamingContextPackage.*;
public class Server {
public static void main(String args[]) throws java.lang.Exception{
System.out.println("Setup CORBA Hello Object");
// Create and initialize the ORB
org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args,null);
// Tao doi tuong CORBA
HelloImpl corba= new HelloImpl();
// Ket noi doi tuong CORBA voi trinh moi gioi ORB
orb.connect(corba);
// Get the root naming context
org.omg.CORBA.Object nameService =
orb.resolve_initial_references("NameService");
NamingContext nsContext =NamingContextHelper.narrow(nameService);
//Tao ten cho doi tuong
NameComponent nc=new NameComponent("Hello","");
// Resolve the object reference in naming
NameComponent path[]={nc};
//Dang ky doi tuong theo ten do dich vu tnameserv quan ly
nsContext.rebind(path,corba);
System.out.println("Waiting for client ");
//Tao doi tuong Java
java.lang.Object obj = new java.lang.Object();
//Thuc hien lap vo tan - cho nhan yeu cau tu client
synchronized (obj){
obj.wait();
}
}//main
}//class
2.1.5 Bước 5 : Xây dựng chương trình Client
• File Client.java
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class Client{
public static void main(String args[]) throws java.lang.Exception{
//Khoi dong trinh moi gioi ORB
org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args,null);
// Get a reference to the object
org.omg.CORBA.Object nameService=
orb.resolve_initial_references("NameService");
//Chuyen tham chieu ve doi tuong NamingContext
NamingContext nsContext = NamingContextHelper.narrow(nameService);
//tao duong dan mang ten doi tuong
NameComponent nc=new NameComponent("Hello","");
NameComponent path[]={nc};
//Lay ve tham chieu cua doi tuong CORBA tren may chu dua vao ten
Trang 13Hello corba=HelloHelper.narrow(nsContext.resolve(path));
System.out.println(corba.sayHello() );
}//main
}//class
2.1.6 Chạy chương trình
• Biên dịch chương trình nguồn
Path=c:\j2sdh.1.4.2\bin
javac *.java
• Chạy chương trình dịch vụ quản lý tên tnameserv.exe của CORBA có tên nameService
tnameserv -ORBInitialPort 2005
• Chạy chương trình Server
java Server -ORBInitialPort 2005 -ORBInitialHost 127.0.0.1
• Chạy chương trình Client
java Client -ORBInitialPort 2005 -ORBInitialHost 127.0.0.1
BÀI TẬP
Xây dựng chương trình CORBA Client bằng các ngôn ngữ như C++, Visual Basic, Delphi để truy xuất đến đối tượng phân tán trên chương trình CORBA Server (Server.java) ở trên