有没有一种方法可以知道客户端和客户端的端口号
RMI 期间的服务器?
如果我没有理解错的话,我认为在 RMI 会话期间没有办法知道端口号。
如果您有一个与默认 RMI 注册表服务器 1099 端口不同的端口号,则必须在服务器类和客户端类上设置它,因为,Oracle RMI 页面 http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html报告:
如果注册表将在 1099 以外的端口上运行,您需要
在对 LocateRegistry.getRegistry 的调用中指定端口号
在服务器和客户端类中。例如,如果注册表是
在此示例中,在端口 2001 上运行,调用getRegistry
在里面
服务器将是:
Registry registry = LocateRegistry.getRegistry(2001);
and:
该客户端首先通过调用来获取注册表的存根
指定主机名的静态 LocateRegistry.getRegistry 方法
在命令行上。如果未指定主机名,则使用 null 作为
指示应使用本地主机地址的主机名。
然后,我的结论是,你无法通过一种方法知道RMI会话的端口号(你可以检查RMI API以获取详细信息),除非你必须设置它,如果它与默认的RMI不同注册表服务器 1099 端口,因为您必须在 RMI 会话开始时知道它。
试想一下:如何获得这个端口号?联系服务器还是客户端?例如,如果您请求位于特定服务器中的页面,该服务器正在侦听端口 81(而不是默认的 80 端口),则您需要提前连接到该特定服务器的端口号,并与其联系,例如:http://192.168.1.1:81
。然后,在 RMI 会话期间,您必须提前知道 RMI 注册表端口。
检查这个page http://www.developer.com/java/other/article.php/3455311/Understanding-Java-RMI-Internals.htm了解详情。
当 RMI 期间将结果返回给客户端时,下次
客户端请求结果,客户端和客户端之间的对话将
服务器与之前的服务器处于相同的端口,当服务器已
自第一个结果返回或创建新端口以来正在运行?
当结果返回给客户端时,客户端和服务器之间的对话应该共享在同一个RMI注册表端口上,否则,如果客户端中设置的RMI注册表端口与服务器RMI注册表端口不同(如果我没有忘记了),代码会抛出一个RemoteException
,当 RMI 进程中发生故障时可能会发生这种情况。
UPDATE
现在我看到你更新的问题。
在2个不同的调用中客户端和服务器的端口号
保持不变 ?
它应该是相同的 RMI 注册表服务器端口。当程序在第一次调用后退出时,程序将关闭套接字连接。下次启动程序时,RMI 注册表端口应该相同。否则,您的程序应该引发异常,或者,当您将参数传递给程序时,您会得到意外的结果。如果我理解的话,您的客户端程序只需调用服务器上的 sum 方法。第一次结果之后,下次启动程序时,您会得到不同的结果吗?如果不是,我认为 RMI 注册表端口是相同的。