banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thủ thuật reverse engineering Nhờ các anh chị giúp đỡ về RMI  XML
  [Question]   Nhờ các anh chị giúp đỡ về RMI 12/07/2010 00:11:28 (+0700) | #1 | 215106
karamata
Member

[Minus]    0    [Plus]
Joined: 16/03/2008 01:50:46
Messages: 24
Offline
[Profile] [PM]
Chào các anh chị trên diễn đàn,
em xây dựng một chương trình đơn giản về RMI như sau:
file Ball.java
Code:
import java.rmi.*;
import java.io.*;
public class Ball implements Serializable, Remote {
	private int weight;
	public Ball(int w){
		this.weight=w;
	}
	public int getWeight(){
		return weight;
	}
	public void setWeight(int w){
		this.weight=w;
	}
}

file ServerSide.java
Code:
import java.rmi.*;
public interface ServerSide extends Remote {
	public void ping(Ball b) throws RemoteException;
}

file ServerSideImpl.java
Code:
import java.rmi.*;
public class ServerSideImpl implements ServerSide {
	
	public void ping(Ball b) throws RemoteException {
		b.setWeight(b.getWeight()+15);
	}
}

file Setup.java
Code:
import java.rmi.*;
import java.rmi.server.*;
public class Setup{
	public static void main(String args[]) throws Exception {
		ServerSide server=new ServerSideImpl();
		UnicastRemoteObject.exportObject(server);
		Naming.rebind("rmi://localhost/server",server);
		System.out.println("Waiting for client...");
	}
}

file Client.java
Code:
import java.rmi.*;
import java.rmi.server.*;
public class Client{
	public static void main(String args[]) throws Exception {
		Ball ball=new Ball(20);
		UnicastRemoteObject.exportObject(ball);
		ServerSide server=(ServerSide)Naming.lookup("rmi://localhost/server");
		System.out.println("------before-----");
		System.out.println(ball.getWeight());
		System.out.println("------before-----");
		server.ping(ball);
		System.out.println("------after------");
		System.out.println(ball.getWeight());
		System.out.println("------after------");
		//System.out.println("------new------");
		//System.out.println(newBall.getWeight());
		//System.out.println("------new------");
	}
}

em biên dịch toàn bộ các file java và rmic tất cả các file có Remote.
Theo em hiểu về tham chiếu trong RMI là những đối tượng nào implements Remote thì có khả năng tham chiếu từ xa.
Nhưng khi em chạy java Client thì bị quăng ra một mớ Exception.
Không biết có phải em hiểu sai về RMI không nữa nhờ các anh chị giải thích giúp.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 12/07/2010 05:19:24 (+0700) | #2 | 215109
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Những exceptions ấy cụ thể là gì? Bồ nên đưa lên các exceptions ấy thì dễ định bệnh hơn.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 12/07/2010 08:56:11 (+0700) | #3 | 215130
karamata
Member

[Minus]    0    [Plus]
Joined: 16/03/2008 01:50:46
Messages: 24
Offline
[Profile] [PM]
Code:
Exception in thread "main" java.lang.IllegalArgumentException: argument type mis
match
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
        at sun.rmi.transport.Transport$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Sou
rce)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour
ce)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source
)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknow
n Source)
        at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
        at sun.rmi.server.UnicastRef.invoke(Unknown Source)
        at ServerSideImpl_Stub.ping(Unknown Source)
        at Client.main(Client.java:11)

theo như những gì em học được và em hiểu thì đối tượng Ball vừa có khả năng tham chiếu vừa có khả năng tham trị. Nếu ta đăng ký với máy chủ java rằng nó có khả năng gọi từ xa bằng lệnh UnicastRemoteObject.exportObject(...) thì nó có thể được tham chiếu. Em làm tất cả rồi mà không biết sao bị lỗi. Mong các anh chị giải thích giúp.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 12/07/2010 09:24:04 (+0700) | #4 | 215133
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Mấy cái exceptions trên không đủ để kết luận gì hết. Chỉ thấy có đoạn này đáng ngờ:

Naming.rebind("rmi://localhost/server",server);

Thử thêm default rmi port (1099) đằng sau localhost xem sao?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 12/07/2010 16:07:55 (+0700) | #5 | 215174
karamata
Member

[Minus]    0    [Plus]
Joined: 16/03/2008 01:50:46
Messages: 24
Offline
[Profile] [PM]

conmale wrote:
Mấy cái exceptions trên không đủ để kết luận gì hết. Chỉ thấy có đoạn này đáng ngờ:

Naming.rebind("rmi://localhost/server",server);

Thử thêm default rmi port (1099) đằng sau localhost xem sao? 

Cái lỗi của em bị quăng ra do Client nên ko liên quan gì đến Server cả. Nếu em bỏ dòng lệnh UnicastRemoteObject.exportObject(ball) trong file Client.java đi thì chương trình chạy đúng nhưng chỉ tham trị mà thôi.
Điều mà em muốn là khi phương thức ping(ball) được gọi bên ServerSideImpl thì đối tượng ball bị thay đổi.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 13/07/2010 04:27:44 (+0700) | #6 | 215199
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

karamata wrote:

conmale wrote:
Mấy cái exceptions trên không đủ để kết luận gì hết. Chỉ thấy có đoạn này đáng ngờ:

Naming.rebind("rmi://localhost/server",server);

Thử thêm default rmi port (1099) đằng sau localhost xem sao? 

Cái lỗi của em bị quăng ra do Client nên ko liên quan gì đến Server cả. Nếu em bỏ dòng lệnh UnicastRemoteObject.exportObject(ball) trong file Client.java đi thì chương trình chạy đúng nhưng chỉ tham trị mà thôi.
Điều mà em muốn là khi phương thức ping(ball) được gọi bên ServerSideImpl thì đối tượng ball bị thay đổi. 


À, ra vậy.

Tớ vừa xem kỹ lại và nghĩ bồ nên xem lại cách "call" Ball object cũng như cách chuẩn bị Ball object phía server.

Ball cần implement một BallInterface và BallInterface này cần Extends Remote. Trên Client program, bồ cần cast BallInterface và lookup RMI. Ví dụ:

Code:
public static void main (String[] argv) {
    try {
      Ballnterface ball = (BallInterface) Naming.lookup("rmi://localhost/server");
      System.out.println (ball.getWeight());
    } catch (Exception e) {
      System.out.println ("BallClient exception: " + e);
    }


Làm như vậy, "ball" object được lấy từ xa xuyên qua RMI chớ không phải là object được khởi tạo locally (như bồ đã làm).

Bồ nên đọc kỹ lại UnicastRemoteObject để hiểu rõ tinh thần của nó:
http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/rmi/server/UnicastRemoteObject.html

"Ball" của bồ ở đây không hề extends Remote. Hơn nữa, bồ đã instantiate "ball" ngay trên Client rồi lại sử dụng UnicastRemoteObject để export "ball" remotely bằng chính "ball" bồ đã instantiated locally thì "ball" chẳng có giá trị gì hết.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 13/07/2010 13:42:29 (+0700) | #7 | 215241
karamata
Member

[Minus]    0    [Plus]
Joined: 16/03/2008 01:50:46
Messages: 24
Offline
[Profile] [PM]

conmale wrote:

karamata wrote:

conmale wrote:
Mấy cái exceptions trên không đủ để kết luận gì hết. Chỉ thấy có đoạn này đáng ngờ:

Naming.rebind("rmi://localhost/server",server);

Thử thêm default rmi port (1099) đằng sau localhost xem sao? 

Cái lỗi của em bị quăng ra do Client nên ko liên quan gì đến Server cả. Nếu em bỏ dòng lệnh UnicastRemoteObject.exportObject(ball) trong file Client.java đi thì chương trình chạy đúng nhưng chỉ tham trị mà thôi.
Điều mà em muốn là khi phương thức ping(ball) được gọi bên ServerSideImpl thì đối tượng ball bị thay đổi. 


À, ra vậy.

Tớ vừa xem kỹ lại và nghĩ bồ nên xem lại cách "call" Ball object cũng như cách chuẩn bị Ball object phía server.

Ball cần implement một BallInterface và BallInterface này cần Extends Remote. Trên Client program, bồ cần cast BallInterface và lookup RMI. Ví dụ:

Code:
public static void main (String[] argv) {
    try {
      Ballnterface ball = (BallInterface) Naming.lookup("rmi://localhost/server");
      System.out.println (ball.getWeight());
    } catch (Exception e) {
      System.out.println ("BallClient exception: " + e);
    }


Làm như vậy, "ball" object được lấy từ xa xuyên qua RMI chớ không phải là object được khởi tạo locally (như bồ đã làm).

Bồ nên đọc kỹ lại UnicastRemoteObject để hiểu rõ tinh thần của nó:
http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/rmi/server/UnicastRemoteObject.html

"Ball" của bồ ở đây không hề extends Remote. Hơn nữa, bồ đã instantiate "ball" ngay trên Client rồi lại sử dụng UnicastRemoteObject để export "ball" remotely bằng chính "ball" bồ đã instantiated locally thì "ball" chẳng có giá trị gì hết. 

OK men, được rồi. Cảm ơn anh nhiều.
Nhưng có một vài thắc mắc em vẫn chưa hiểu lắm.
1. Tại sao em phải implement một BallInterface và BallInterface này phải extends Remote(trong trường hợp này của em thì em extends cả Remote và Serializable luôn).
2. Theo những gì em hiểu thì ball object được lấy xuyên qua RMI thông qua stub của nó. muốn làm được điều này thì phải cast nó vì lệnh UnicastRemoteObject.exportObject(...) sẽ load cái thằng stub để làm việc thông qua RMI.
Những gì em biết chỉ có thế. anh xem có phải ko?
[Up] [Print Copy]
  [Question]   Nhờ các anh chị giúp đỡ về RMI 15/07/2010 07:55:54 (+0700) | #8 | 215362
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

karamata wrote:

OK men, được rồi. Cảm ơn anh nhiều.
Nhưng có một vài thắc mắc em vẫn chưa hiểu lắm.
1. Tại sao em phải implement một BallInterface và BallInterface này phải extends Remote(trong trường hợp này của em thì em extends cả Remote và Serializable luôn).
2. Theo những gì em hiểu thì ball object được lấy xuyên qua RMI thông qua stub của nó. muốn làm được điều này thì phải cast nó vì lệnh UnicastRemoteObject.exportObject(...) sẽ load cái thằng stub để làm việc thông qua RMI.
Những gì em biết chỉ có thế. anh xem có phải ko? 


Bồ không extends mà implements Remote interface. Nếu bồ đọc kỹ javadoc của Remote interface thì sẽ thấy:

The Remote interface serves to identify interfaces whose methods may be invoked from a non-local virtual machine. Any object that is a remote object must directly or indirectly implement this interface. Only those methods specified in a "remote interface", an interface that extends java.rmi.Remote are available remotely.

Implementation classes can implement any number of remote interfaces and can extend other remote implementation classes. RMI provides some convenience classes that remote object implementations can extend which facilitate remote object creation. These classes are java.rmi.server.UnicastRemoteObject and java.rmi.activation.Activatable.  


Nếu bồ extends Remote interface trực tiếp, bồ không thể lấy được object từ xa. Bồ chỉ có thể extends một class đã implement Remote interface mà thôi.

Tài liệu này giải thích rất rõ: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/guide/rmi/spec/rmiTOC.html

Have fun.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|