在machine1 / folder1中,我放置了HelloClient.java
& HelloInterface.java
并运行java1.5编译:
javac HelloClient.java HelloInterface.java
在machine2 / folder2中,我放置了HelloInterface.java
/ Hello.java
/ HelloServer.java
个文件并运行了java 1.5编译:
javac *.java` //here `HelloInterface` definition is required by Hello Class only for compilation.
存根/骨架类也会在machine2中生成。
我将Hello_stub.class
复制到machine1 / folder1
接下来,我运行了对象注册表
rmiregistry &
并启动服务器,将对象绑定到该注册表。
java -Djava.security.policy=policy HelloServer &
策略文件的位置
grant{
permission java.security.AllPermission;
}
然后运行客户端:
java HelloClient testing abc
我的问题是:
1)当我们从客户端程序调用{{1}}与machine2通信时,machine1上的HelloClient.class
正在使用Hello_stub.class
,
但是我不清楚hello.say()
调用机器2上的Hello_skel.class
实例?你能帮我理解一下吗?
2)来自C中的套接字编程背景,我如何可视化HelloServer.class
/ socket()
部分客户端程序和connect()
/ socket()
/ bind()
/ listen()
这个RMI框架中的服务器程序是什么?
我写了下面的接口(HelloInterface.java)
accept()
我编写了下面的类(Hello.java),其对象的方法将从远程访问。
import java.rmi.*;
public interface HelloInterface extends Remote{
public String say(String msg) throws RemoteException;
}
我编写了Server程序(HelloServer.java),它使用rmiregistry程序注册'Hello'对象。
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInterface {
private String message;
public Hello(String msg) throws RemoteException{
message = msg;
}
public String say(String m) throws RemoteException{
return new StringBuffer(m).reverse().toString();
}
}
我编写了调用远程方法'say'
的客户端程序(HelloClient.java)import java.rmi.*;
import java.rmi.server.*;
public class HelloServer{
public static void main(String argv[]){
if(System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try{
Naming.rebind("Hello", new Hello("Hello, world!"));
System.out.println("Server is running");
}catch(Exception e){
System.out.println("Hello server failed: " + e);
}
}
}
答案 0 :(得分:1)
// here HelloInterface definition is required by Hello Class only for compilation
没有。 HelloServer
和HelloClient
也需要进行编译,并且在运行时,服务器和客户端以及RMI注册表都需要它。
存根/骨架类也会在machine2中生成。
没有。自1998年以来,RMI骨架已经过时。除非您使用rmic
选项-v1.1
或-vcompat,
,否则您根本不会生成一个,但您不需要使用它们。如果您只是将rmic
添加到super(0)
构造函数中,则自Java 1.5以来甚至不需要使用Hello
本身。
我将
Hello_stub.class
复制到machine1 / folder1
此处还需要HelloInterface.class
。
当我们从客户端程序调用hello.say()与machine2进行通信时,machine1上的HelloClient.class正在使用Hello_stub.class
正确。
[我]不清楚HelloServer.class调用机器2上的Hello_skel.class实例
根本不会调用它,除非您使用rmic -v1.1,
,在这种情况下,RMI 调用以在RMI运行时系统和Hello
对象之间进行调解。它根本与HelloServer
类没有任何关系。
来自C中的套接字编程背景,我如何可视化socket()/ connect()客户端程序的一部分
RMI根据需要创建连接,对它们进行池化,并在它们空闲时关闭它们。调用Naming.lookup(),
和另一个调用远程方法需要连接。
这个RMI框架中的服务器程序的和socket()/ bind()/ listen()/ accept()pasrt?
导出远程对象会创建一个侦听套接字,或者共享一个已由RMI创建的套接字。 RMI运行时系统调用accept(),
从它所用的远程对象的请求头中解决,并通过请求中的参数通过反射(或旧骨架)调用该远程对象,并发送结果或异常(如果有的话)回到客户端。
NB:
除非您使用的是RMI代码库功能,否则不需要SecurityManager
或.policy文件或-Djava.security.policy
参数。
我没有在msg
中看到Hello.
参数和实例成员的用途。您没有使用它。
您真的不需要HelloServer.
您可以将main()
方法放入Hello.
您的客户端不会在其查找的对象上调用任何远程方法。想必要添加一下吗?