在RMI期间知道端口号
有没有一种方法可以在RMI期间知道客户端和服务器的端口号?在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再次启动我的客户端。现在请求将从与之前发送的端口相同的端口发送,并且服务器是否会在同一端口上接收请求?或者情况与我刚刚写的不一样?
有没有一种方法可以知道客户端和服务器的端口号?
不可以。事先不能知道客户端口号,因为它是在连接上动态分配的,而服务器IP:端口嵌入在存根中,您无法获取它。你为什么需要知道?这些信息对你没有多大的好处:你不能使用它。
当RMI过程中,返回给客户端的结果,下一次 客户端请求的结果,将客户端和 服务器之间的对话是在相同的端口以前,当服务器已经 运行因为第一个结果被返回或者创建了一个新的端口?
或者:
- 客户端连接被重用,与相同的端口号,或者
- 与可能在客户端创建新的本地端口的新连接。
这是不可能的。服务器端口保持不变。
在2个不同的调用中,客户端和服务器端口号 保持不变?
参见上文。
我的客户端程序在输入如
java AddClient localhost 100 200
之类的命令后退出。服务器上的方法返回300,客户端退出。下次我再次用java AddClient localhost 19 100
开始我的客户。现在将请求从以前发送的同一端口发送。
可能不是。
并且服务器会在同一个端口上接收到请求吗?
无法看到您的服务器代码说。如果您将其导出到一个常数端口上,它会导出到一个常数端口上。如果没有,不是。重言式真的。
或者情况与我刚刚写的不同?
我不明白这个问题。
@downvoter请解释。无法解释的downvotes对任何人都没有任何好处:不是海报,OP或社区。如果您认为上述内容有误,请说明。 – EJP 2011-12-24 08:42:12
您是否在意解释*服务器IP:端口已嵌入存根中,您无法获取它* ...!我认为'LocateRegistry.getRegstry(int port_number);'已经允许客户端知道服务器端口号和/或IP .. – 2015-08-24 12:11:46
@Am_I_Helpful'LocateRegistry.getRegistry()'返回的存根是一个* Registry *存根;它仍然是一个存根,对应用程序是不透明的;并且它包含您作为参数提供给您的端口号,您已经知道。这不是解决这个问题的方法。注意不响应评论的downvote不是如何SO应该工作IMO。 – EJP 2015-08-25 04:52:29
在RMI期间有没有一种方法可以知道客户端和 服务器的端口号?
如果我没有误解,我认为在RMI会话期间无法知道端口号。
如果你有不同的端口号,从默认的RMI注册表服务器1099端口,则必须将其设置,服务器类和客户端类,因为,作为Oracle RMI page报告:
如果注册表将运行在1099以外的端口上,则需要 指定服务器和客户端类中对LocateRegistry.getRegistry 的调用中的端口号。例如,如果注册表在这个例子上2001端口上运行 ,在 服务器调用
getRegistry
是:
Registry registry = LocateRegistry.getRegistry(2001);
和:
该客户首先获得存根通过在命令行上调用 静态LocateRegistry.getRegistry方法和指定为主机名 的注册表。如果没有指定主机名,则使用空值作为指示应使用本地主机地址的主机名 。
然后,我的结论是,您不能通过方法知道RMI会话的端口号(您可以查看RMI API的详细信息),除非必须设置它,否则与默认的RMI注册表Server 1099端口不同,因为您必须在RMI会话开始时知道它。
只是想:你怎么能得到这个端口号?联系服务器或客户端?例如,如果您请求位于特定服务器中的页面,该页面正在侦听端口81(而不是默认的80端口),则需要提前连接到此特定服务器的端口号,例如: http://192.168.1.1:81
。然后,在RMI会话期间,您必须事先知道RMI注册表端口。
查看详情,请点击这里page。
当RMI过程中,返回给客户端的结果,下一次 客户端请求的结果,将客户端和 服务器之间的对话是在相同的端口以前,当服务器已经 运行因为第一个结果被返回或者创建了一个新的端口?
当结果返回给客户端,客户端和服务器之间的对话应该在同一RMI注册端口共享,否则,如果在客户端设置的RMI注册表端口与服务器RMI注册端口不同(如果我没有忘记),代码将会抛出一个RemoteException
,这可能会在RMI进程发生故障时发生。
UPDATE
现在我看到更新的问题。
在2个不同的调用中,客户端和服务器端口号 保持不变?
它应该是相同的RMI注册表服务器端口。当您的程序在第一次调用后退出时,程序将关闭套接字连接。下次启动程序时,RMI注册表端口应该是相同的。否则,你的程序应该抛出异常,或者当你将参数传递给程序时,你会得到意想不到的结果。如果我明白了,你的客户端程序只是在服务器上调用sum方法。第一次结果之后,下一次启动程序时,你会得到不同的结果吗?如果没有,我认为RMI注册表端口是一样的。
了解您的TCP/IP:客户端连接到某个端口上的服务器。客户端端口号是随机的(或者应该是出于安全原因),服务器端口号是已知的(否则,客户端将无法连接到第一位)。
TCP/IP协议将建立连接。服务器将为连接创建一个处理程序,TCP/IP将为此连接分配一个新的随机端口。服务器端的端口号不会更改。由于服务器可以使用客户端的IP +端口作为区分不同“会话”的关键字,因此任何数量的客户端都可以连接到同一个服务器端口。
这意味着:在RMI框架初始化后,客户端和服务器将通过一对端口相互通信,只要连接存在就不会改变。
如果连接将被切断出于某种原因,一个新的连接可以建立但可能会得到一个新的端口号上。双方客户侧S
我的客户端程序退出
这意味着连接将被切断。当您再次启动客户端时,会创建一个新的客户端端口。它很可能(在65534:65535的机会大概是1)将是一个新的端口号。
如果你在两分钟内重新启动客户端,端口号小号必须是不同的,因为老港 s的保持活动状态两分钟,以确保“remote TCP received the acknowledgment of its connection termination request” (如果运行netstat
,你会看到这些状态为TIME_WAIT
)。
我认为你的问题不是很清楚。如果将远程对象绑定到某个端口,它将在那里可用并且不会移动到其他端口。你能否展示一些代码来表明你的问题或澄清你的问题? – mort 2011-12-21 15:23:52
服务器端口当然不会改变。 OP正在谈论客户的端口。所以问题是如果多个RMI调用建立到服务器的新连接(导致不同的客户端端口)或不。 – f1sh 2011-12-21 15:26:09
@ mort我更新了我的问题 – 2011-12-21 15:31:47