4

有没有办法在 RMI 期间知道客户端和服务器的端口号?

当 RMI 期间向客户端返回结果时,下次客户端请求结果时,客户端和服务器之间的会话是否会与上一次在同一端口,当服务器自返回第一个结果后一直在运行时,或者新的创建端口?

例如 :

// call to a remote method add
     addServerIntf.add(d1,d2)
// after this call i get the added result

// again call the add method by again starting the client
    addServerIntf.add(d1,d2)
// I get the result back as usual

在 2 个不同的调用中,客户端和服务器的端口号是否保持不变?

我的客户端程序在输入类似 java AddClient localhost 100 200 这样的命令后退出服务器上的方法返回300,客户端退出。下次我用 java AddClient localhost 19 100 再次启动我的客户端。现在请求将从与之前发送的相同端口发送,服务器会在同一端口接收请求吗?还是情况和我刚才写的不一样?

4

3 回答 3

3

有没有办法在 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 注册表端口是相同的。

于 2011-12-21T16:21:53.213 回答
2

有没有办法知道客户端和服务器的端口号?

不,您无法提前知道客户端端口号,因为它是在连接时动态分配的,并且服务器 IP:port 嵌入在您无法获取的存根中。为什么你需要知道?信息对你没有多大好处:你不能使用它。

当 RMI 期间向客户端返回结果时,下次客户端请求结果时,客户端和服务器之间的会话是否会与上一次在同一端口,当服务器自返回第一个结果后一直在运行时,或者新的创建端口?

任何一个:

  • 客户端连接被重用,具有相同的端口号,或者
  • 在客户端创建一个可能带有新本地端口的新连接。

不可能说是哪个。服务器端口保持固定。

在 2 个不同的调用中,客户端和服务器的端口号是否保持不变?

往上看。

我的客户端程序在输入类似的命令后退出java AddClient localhost 100 200。服务端方法返回300,客户端退出。下次我再次使用java AddClient localhost 19 100. 现在将从与之前发送的相同端口发送请求

可能不是。

服务器会在同一个端口上接收请求吗?

没有看到您的服务器代码就不可能说。如果您将其导出到常量端口,则它会导出到常量端口。如果不是,则不是。真是重言式。

还是情况和我刚才写的不一样?

我不明白这个问题。

于 2011-12-23T02:49:55.833 回答
-1

了解您的 TCP/IP:客户端连接到某个端口上的服务器。客户端端口号是随机的(或者应该是出于安全原因),服务器端口号是已知的(否则,客户端首先无法连接)。

然后 TCP/IP 协议将建立连接。服务器将为该连接创建一个处理程序,并且 TCP/IP 将为该连接分配一个新的随机端口。服务器端的端口号不会改变。由于服务器可以使用客户端的IP+端口作为区分不同“会话”的关键,因此任意数量的客户端都可以连接到同一个服务器端口。

这意味着:在 RMI 框架初始化后,客户端和服务器都将通过一对端口相互通信,只要连接存在,该端口就不会改变。

如果连接由于某种原因被切断,可以建立一个新的连接,但这可能会在客户端双方获得一个新的端口

我的客户程序退出

这意味着连接被切断。当您再次启动客户端时,会创建一个新的客户端端口。它很可能(概率为 65534:65535,大约为 1)将是一个新的端口号。

如果您在两分钟内再次启动客户端,则端口号s必须不同,因为旧端口s 会保持活动状态两分钟,以确保“远程 TCP 收到其连接终止请求的确认”(如果您运行netstat,您将看到这些状态TIME_WAIT)。

于 2011-12-21T16:28:25.770 回答