JavaRMI-了解Oracle教程
我试图理解Oracle的RMI java教程,我有一些问题。本教程链接到此处以供参考:JavaRMI-了解Oracle教程,java,rmi,Java,Rmi,我试图理解Oracle的RMI java教程,我有一些问题。本教程链接到此处以供参考: 服务器代码: 客户端代码: 1) 在服务器示例中,主函数的最后一行是:System.out.println(“ComputeEngine绑定”)。正常执行会说,此时,主函数退出,程序终止。但是,某些原因导致程序阻塞。有人知道为什么在运行服务器时程序会阻塞(而不是在打印计算引擎绑定后退出)吗 2) 关于上一个问题,服务器似乎正在阻塞并侦听端口。它在哪个端口监听?注册中心如何知道服务器正在监听哪个端口 3)
- 服务器代码:
- 客户端代码:
System.out.println(“ComputeEngine绑定”)代码>。正常执行会说,此时,主函数退出,程序终止。但是,某些原因导致程序阻塞。有人知道为什么在运行服务器时程序会阻塞(而不是在打印计算引擎绑定后退出)吗
2) 关于上一个问题,服务器似乎正在阻塞并侦听端口。它在哪个端口监听?注册中心如何知道服务器正在监听哪个端口
3) 我的另一个问题是,当客户端从RMIRegistry(使用registry.lookup
)获取存根,然后在此存根上调用executeTask
时,计算是在运行RMIRegistry的机器上进行的,还是在运行服务器代码的机器上进行的?i、 e.存根是否告诉RMI注册表在注册表中或服务器的main
函数中的computeEngine
实例上运行executeTask
。在这些线程死亡之前,程序不会终止
它将0指定为端口,这意味着它使用一个随机端口,操作系统为其定义范围
存根封装TCP/IP调用,通知服务器调用该方法。因此,实际实现在托管代码的服务器上运行。如果在服务器代码上放置println,则在调用该函数时会看到它被打印出来
RMI为它正在侦听的每个端口创建一个接受线程。只有当在相应端口上导出的所有远程对象都未被显式或通过DGC导出时,这些线程才会退出
它正在侦听您在构造或导出远程对象时指定的任何端口,或者侦听系统分配的端口(如果未指定),或者侦听指定的零。注册表不知道那是什么端口,但存根知道
计算发生在导出远程对象的主机上,但通常是与注册表相同的主机,因为很难(但并非不可能)将远程对象绑定到不同主机中的注册表
谢谢这很有帮助。再加上:“注册中心如何知道服务器正在监听哪个端口?”它嵌入到存根中。但它只需要知道,对于DGC目的,这是由注册JVM中的RMI运行时系统执行的。注册表本身根本不需要知道端口。它指定了您指定的任何端口,如果不需要,则指定为零。操作系统提供随机端口本身,而不仅仅是范围。