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