百分求助:RMI 中的端口问题

denverbenjamin2000 2009-01-06 12:12:55
在RMI中有四个地方出现了端口的概念

1 static Remote
exportObject(Remote obj, int port)
          使用提供的特定端口导出远程对象,以便能够接收传入的调用。
2 LocateRegistry.createRegistry( PORT );

3 String urlString = "//" + HOST_NAME + ":" + Integer.toString( PORT ) + "/" + "HelloService";
Naming.rebind( urlString, h );

4 h = (Hello)Naming.lookup( "rmi://" + HOST_NAME + ":" + Integer.toString( PORT ) + "/HelloService" );


但据我的实验,2 与 3中的port可以不一样,不影响正常使用。
port之间的关系如何?这些地方的port一定要一样么?
...全文
601 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
YuLimin 2009-01-22
  • 打赏
  • 举报
回复
这是个好问题,大家可以通过在两台机器上面去做实验,前提,安装上防火墙进行观察,就知道端口到底需要一个,还是2个了。
socool627 2009-01-21
  • 打赏
  • 举报
回复
up
receive099 2009-01-21
  • 打赏
  • 举报
回复
mark
netsocket 2009-01-21
  • 打赏
  • 举报
回复
mark
云上飞翔 2009-01-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 denverbenjamin2000 的回复:]
引用 12 楼 jiangnaisong 的回复:
引用 1 楼 java2000_net 的回复:
Remote调用
1 你必须知道注册服务在哪里?
2 你必须知道服务所在的端口

所以至少应该有2个端口,一个负责注册服务,另一个提供服务。

答:完全正确!rmiregistry 在自己的端口号上完成注册与查询服务,而UnicastRemoteObject在自己的端口号上完成远程服务.而这两个端口号是不相同的.若UnicastRemoteObject没有选择自己的PORT,是系统自动帮它选择一个…
[/Quote]
答:"但是,客户端只需要知道rmiregistry 的端口号就行了,对吧"
是的.
denverbenjamin2000 2009-01-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jiangnaisong 的回复:]
引用 1 楼 java2000_net 的回复:
Remote调用
1 你必须知道注册服务在哪里?
2 你必须知道服务所在的端口

所以至少应该有2个端口,一个负责注册服务,另一个提供服务。

答:完全正确!rmiregistry 在自己的端口号上完成注册与查询服务,而UnicastRemoteObject在自己的端口号上完成远程服务.而这两个端口号是不相同的.若UnicastRemoteObject没有选择自己的PORT,是系统自动帮它选择一个.
[/Quote]
但是,客户端只需要知道rmiregistry 的端口号就行了,对吧
云上飞翔 2009-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
Remote调用
1 你必须知道注册服务在哪里?
2 你必须知道服务所在的端口

所以至少应该有2个端口,一个负责注册服务,另一个提供服务。
[/Quote]
答:完全正确!rmiregistry 在自己的端口号上完成注册与查询服务,而UnicastRemoteObject在自己的端口号上完成远程服务.而这两个端口号是不相同的.若UnicastRemoteObject没有选择自己的PORT,是系统自动帮它选择一个.
denverbenjamin2000 2009-01-09
  • 打赏
  • 举报
回复
我上面的帖子错了,因为http://blog.163.com/xiao_maomao_chong/blog/static/31686239200861744356634/中
远程对象扩展了UnicastRemoteObject,所以不需要stub

第3种方式 需要 rmic 出 一个 stub ,而第1种方式不需要。

1 RMI : difference between the "extends UnicastRemoteObject" and Payment stub = (Payment) UnicastRemoteObject.exportObject(robj, 0); and the
2new edition 5.0后 :
Payment stub = (Payment) UnicastRemoteObject.exportObject(robj, 0); 这种方式如果把0 去掉,采用匿名,就找不到stub
Registry registry = LocateRegistry.getRegistry();
registry.bind("Mortgage", stub);
3older edition,5.0前 : need the stub by rmic
UnicastRemoteObject.exportObject( bm ); 这种方式 需要 rmic stub ,而第一中方式不需要
如果使用 UnicastRemoteObject.exportObject(Remote) 方法导出该远程对象,则加载 stub 类(通常使用 rmic 工具从远程对象的类预生成)并按以下方式构造 stub 类的实例。
“根类”按以下情形确定:如果远程对象的类直接实现扩展 Remote 的接口,则远程对象的类为根类;否则,根类为直接实现扩展 Remote 接口的远程对象类的最具派生能力的超类。
要加载的 stub 类的名称通过连接带有后缀 "_Stub" 的根类的二进制名称确定。
按使用根类的类加载器的名称加载 stub 类。该 stub 类必须扩展 RemoteStub 并且必须有公共构造方法,该构造方法有一个属于类型 RemoteRef 的参数。
最后,用 RemoteRef 构造 stub 类的实例。
如果无法找到适当的 stub 类,或无法加载 stub 类,或创建 stub 实例时出现问题,则抛出 StubNotFoundException。
Naming.rebind("//localhost/BankSystem", bm)
xiaohui5850 2009-01-09
  • 打赏
  • 举报
回复
楼主你自己都没说明白,你到底怎么调用的情况下
不影响正常使用了
等你说清楚了再解释吧
xiaohui5850 2009-01-09
  • 打赏
  • 举报
回复
靠,说了那么多,每一个人说到要点上
likgui 2009-01-08
  • 打赏
  • 举报
回复
学习了
denverbenjamin2000 2009-01-08
  • 打赏
  • 举报
回复
http://blog.163.com/xiao_maomao_chong/blog/static/31686239200861744356634/
这个帖子说得很好
但是关于他对于rmic 和 stub的说法 不敢苟同。
我知道在5.0后JDK版本支持不使用rmic的一种用法
服务器端:
 try {
PaymentImpl robj = new PaymentImpl();
Payment stub = (Payment) UnicastRemoteObject.exportObject(robj, 0);

Registry registry = LocateRegistry.getRegistry();
registry.bind("Mortgage", stub);
System.out.println("Mortgage Server is ready to listen");

} catch (Exception e) {
}
}

客户端:
try {
Registry reg = LocateRegistry.getRegistry("localhost");
stub = (Payment) reg.lookup("Mortgage");

} catch (Exception e)


但是,在http://blog.163.com/xiao_maomao_chong/blog/static/31686239200861744356634/
例子中,仍然是使用的Naming.rebind

LocateRegistry.createRegistry(1099);

HelloInterface hello = new Hello("Hello, world!");

//把hello注册到RMI注册服务器上,命名为Hello

Naming.rebind("Hello", hello);




这种方式启动,虽然不需要再于命令行启动rmiregistry,但还是要用rmic 生成stub否则
java.rmi.StubNotFoundException: Stub class not found: RMIServer_Stub; nested exc
eption is:
java.lang.ClassNotFoundException: RMIServer_Stub
denverbenjamin2000 2009-01-08
  • 打赏
  • 举报
回复
//启动RMI注册服务,指定端口为1099 (1099为默认端口)

//也可以通过命令 $java_home/bin/rmiregistry 1099启动

//这里用这种方式避免了再打开一个DOS窗口

//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用

LocateRegistry.createRegistry(1099);
glglglglglgllll 2009-01-06
  • 打赏
  • 举报
回复
leo_bogard 2009-01-06
  • 打赏
  • 举报
回复
up
老紫竹 2009-01-06
  • 打赏
  • 举报
回复
Remote调用
1 你必须知道注册服务在哪里?
2 你必须知道服务所在的端口

所以至少应该有2个端口,一个负责注册服务,另一个提供服务。
hbwhwang 2009-01-06
  • 打赏
  • 举报
回复
如果是2个端口,那么应该是启动了2个RMI服务
你的服务是注册到哪个端口,就必须到哪个端口调用
hbwhwang 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
Remote调用
1 你必须知道注册服务在哪里?
2 你必须知道服务所在的端口

所以至少应该有2个端口,一个负责注册服务,另一个提供服务。
[/Quote]

只有一个端口!
随着航天领域技术能力的持续提升,人造卫星的部署频次与在轨规模不断扩大,由此引发的空间目标碰撞风险已成为关键安全议题。为确保航天器在轨运行安全,必须构建有效的碰撞规避策略。本方案基于MATLAB/Simulink仿真环境,构建了一套完整的卫星碰撞规避仿真系统,用于模拟轨道动力学行为、识别碰撞威胁并生成规避机动指令。 系统首先建立精确的卫星轨道动力学模型。该模型依据牛顿力学与开普勒轨道定律,同时纳入地球非球形引力摄动、日月引力扰动及其他空间环境因素的影响,以准确描述卫星在复杂力场的运动轨迹。 在动力学模型基础上,系统集成了实时碰撞预警模块。该模块持续监测卫星与周边空间目标之间的相对运动状态,通过位置与速度矢量的实时计算,快速识别潜在的近距离接近事件。一旦判定存在碰撞风险,系统随即启动规避策略计算单元。规避策略通常包括调整速度矢量、改变轨道高度或轨道倾角,乃至实施紧急变轨机动,以在确保安全的前提下最大限度地减少对原定任务的影响。 Simulink的图形化建模环境为系统各模块的集成与测试提供了便利。通过搭建包含动力学、预警与决策模块的仿真模型,可在统一平台进行闭环测试与迭代优化,从而验证规避策略的有效性与实时性。 方案实施需着重关注以下方面:系统需具备高可靠性及毫秒级响应能力,确保在极短时间内完成威胁评估与机动规划;规避策略应尽可能降低燃料消耗,延长卫星服役寿命;系统架构应保持开放性与可扩展性,以适应未来多星协同、星座运行等复杂场景。 基于MATLAB/Simulink的卫星碰撞规避仿真系统,不仅提升了在轨航天器的生存能力与任务可靠性,也为航天器设计、轨道控制与任务规划提供了重要的技术支撑,对促进航天工程的安全发展具有显著的实际价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧