知道RMI期间的端口号

时间:2011-12-21 15:10:55

标签: java rmi port-number

是否有方法在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再次启动我的客户端。现在请求从之前发送的同一端口发送请求服务器是否会在同一端口上接收请求?或者情况与我刚刚写的不同?

3 个答案:

答案 0 :(得分:3)

  

是否有方法知道客户端和端口号   RMI期间的服务器?

如果我没有误解,我认为在RMI会话期间无法知道端口号。

如果您有一个不同的端口号,从默认的RMI注册表Server 1099端口,您必须在Server类和Client类上设置它,因为,Oracle RMI page报告:

  

如果注册表将在1099以外的端口上运行,则需要   在LocateRegistry.getRegistry的调用中指定端口号   在Server和Client类中。例如,如果注册表是   在本例中,在端口2001上运行,调用getRegistry   服务器将是:

Registry registry = LocateRegistry.getRegistry(2001);

  

此客户端首先通过调用来获取注册表的存根   static指定主机名的LocateRegistry.getRegistry方法   在命令行上。如果未指定主机名,则使用null作为   指示应使用本地主机地址的主机名。

然后,我的结论是,您无法通过方法知道RMI会话的端口号(您可以查看RMI API以获取详细信息),除非您必须设置它,如果它不同于默认的RMI注册表Server 1099端口,因为您必须在RMI会话开始时知道它。

想一想:如何获得此端口号?联系服务器或客户端?例如,如果您请求位于特定服务器中的页面,即正在侦听端口81(而不是默认的80端口),则需要提前连接到此特定服务器的端口号,并与其联系,例如: http://192.168.1.1:81然后,在RMI会话期间,您必须事先知道RMI注册表端口。

查看此page了解详情。

  

在RMI期间将结果返回给客户端时,下次将该结果返回给客户端   客户端请求结果,将客户端之间的对话   当服务器已经存在时,服务器与前一个端口在同一个端口   返回第一个结果或创建新端口后运行?

当结果返回到客户端时,客户端和服务器之间的对话应该在同一个RMI注册表端口上共享,否则,如果客户端中设置的RMI注册表端口与服务器RMI注册表端口不同(如果我没有忘记),代码将抛出RemoteException,这可能发生在RMI进程中发生故障时。

<强>更新

现在我看到你的更新问题了。

  

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

它应该是相同的RMI注册表服务器端口。当程序在第一次调用后退出时,程序将关闭套接字连接。下次启动程序时,RMI注册表端口应该相同。否则,您的程序应该抛出异常,或者,当您将参数传递给程序时,会得到意外的结果。如果我理解,您的客户端程序只需在服务器上调用sum方法。在第一个结果之后,下次启动程序时,您会得到不同的结果吗?如果没有,我认为RMI注册表端口是相同的。

答案 1 :(得分:2)

  

是否有方法知道客户端和服务器的端口号?

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

  

在RMI期间将结果返回给客户端时,下次将该结果返回给客户端   客户端请求结果,将客户端之间的对话   当服务器已经存在时,服务器与前一个端口在同一个端口   返回第一个结果或创建新端口后运行?

或者:

  • 重复使用客户端连接,使用相同的端口号或
  • 在客户端创建可能有新本地端口的新连接。

无法分辨出哪一个。服务器端口保持固定。

  

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

见上文。

  

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

可能不是。

  

并且服务器是否会在同一端口上接收请求?

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

  

或者情况与我刚刚写的不同?

我不明白这个问题。

答案 2 :(得分:-1)

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

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

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

如果由于某种原因断开了连接,则可以建立新的连接,但可能会在客户端的双方上获得新的端口号 s 。 / p>

  

我的客户端程序退出

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

如果在两分钟内再次启动客户端,则端口号 s 必须不同,因为旧端口 保持活动状态两分钟以确保“remote TCP received the acknowledgment of its connection termination request”  (如果您运行netstat,则会看到状态为TIME_WAIT的这些内容。