<![CDATA[Latest posts for the topic "Nhờ các anh chị giúp đỡ về RMI"]]> /hvaonline/posts/list/36.html JForum - http://www.jforum.net Nhờ các anh chị giúp đỡ về RMI 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.]]>
/hvaonline/posts/list/35025.html#215106 /hvaonline/posts/list/35025.html#215106 GMT
Nhờ các anh chị giúp đỡ về RMI /hvaonline/posts/list/35025.html#215109 /hvaonline/posts/list/35025.html#215109 GMT Nhờ các anh chị giúp đỡ về RMI 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.]]>
/hvaonline/posts/list/35025.html#215130 /hvaonline/posts/list/35025.html#215130 GMT
Nhờ các anh chị giúp đỡ về RMI Naming.rebind("rmi://localhost/server",server); Thử thêm default rmi port (1099) đằng sau localhost xem sao?]]> /hvaonline/posts/list/35025.html#215133 /hvaonline/posts/list/35025.html#215133 GMT Nhờ các anh chị giúp đỡ về RMI

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.]]>
/hvaonline/posts/list/35025.html#215174 /hvaonline/posts/list/35025.html#215174 GMT
Nhờ các anh chị giúp đỡ về RMI

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.]]>
/hvaonline/posts/list/35025.html#215199 /hvaonline/posts/list/35025.html#215199 GMT
Nhờ các anh chị giúp đỡ về RMI

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?]]>
/hvaonline/posts/list/35025.html#215241 /hvaonline/posts/list/35025.html#215241 GMT
Nhờ các anh chị giúp đỡ về RMI

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.]]>
/hvaonline/posts/list/35025.html#215362 /hvaonline/posts/list/35025.html#215362 GMT