当前位置: 首页 > 面试题库 >

如何确保RMI仅使用一组特定的端口?

宓英哲
2023-03-14
问题内容

在我们的应用程序中,我们以非常不同的方式将RMI用于客户端-服务器通信:

  1. 将数据从服务器推送到客户端以进行显示。
  2. 从客户端向服务器发送控制信息。
  3. 这些控制消息的回调从服务器到达客户端的代码路径(边栏说明-这是某些旧有代码的副作用,而不是我们的长期意图)。

我们要做的是确保我们所有与RMI相关的代码仅使用已知的指定端口清单。这包括注册表端口(通常应为1099),服务器端口以及由回调产生的所有端口。

这是我们已经知道的:

  1. LocateRegistry.getRegistry(1099)或Locate.createRegistry(1099)将确保注册表正在侦听1099。
  2. 将UnicastRemoteObject构造函数/ exportObject静态方法与port参数一起使用将指定服务器端口。

这些要点也将在此Sun论坛帖子中介绍。

我们不知道的是:我们如何确保由回调产生的返回服务器的客户端连接将仅在指定端口上连接,而不是默认为匿名端口?

编辑:添加了一个冗长的答案,总结了我的发现以及我们如何解决问题。希望这将对其他遇到类似问题的人有所帮助。

第二次编辑:事实证明,在我的应用程序中,我创建和修改套接字工厂似乎存在竞争条件。我本来希望允许用户在Beanshell脚本中覆盖我的默认设置。不幸的是,工厂创建第一个套接字后,我的脚本似乎正在大量运行。结果,我从默认设置和用户设置中混合了端口。这将超出此问题的范围,需要做更多的工作,但我认为我想指出这一点,这是其他人在某些时候可能不得不承担这些责任的兴趣所在。


问题答案:

您可以使用自定义RMI套接字工厂来执行此操作。

套接字工厂创建供RMI在客户端和服务器端使用的套接字,因此,如果您编写自己的套接字,则可以完全控制所使用的端口。客户端工厂在服务器上创建,序列化,然后发送到客户端,这很简洁。

这是Sun的指南,告诉您如何做。



 类似资料:
  • 我看到了很多关于Kryo是否可以用来替换RMI所使用的默认JVM序列化的问题,但没有关于如何实际设置它的问题。我听说Kryo是JVM序列化的“插入式”替换,不确定这是否意味着您可以从运行时类路径中交换一些JAR(就像SLF4J绑定等的情况一样),或者其他东西。 所以我要问:如何使用Kryo而不是Java附带的默认JVM序列化来获得RMI?提前道谢!

  • 在我们的YouTrack项目中,所有问题在历史上对“所有用户”都是可见的,这也是随YouTrack附带的同名组。 现在我们正在添加具有受限权限的新用户,他们应该只能看到问题的一小部分。他们应该开始看不到任何问题,然后有选择地让他们看到单个问题(旧问题和新问题)。 我尝试了不同的方法来实现这一点,但没有成功。 1)如果我为他们创建了一个组“受限组”--那么我可以授予这个组查看问题的权限。然后他们可以

  • 我已经在纸质空间云架构体系上创建了虚拟笔记本,后端有Tensorflow GPU P5000虚拟实例。当我开始训练我的网络时,它比我的MacBook Pro用纯CPU运行时引擎慢2倍。如何确保Keras NN在训练过程中使用GPU而不是CPU? 请在下面找到我的代码:

  • 问题内容: 我只想在我的姓名字段中输入字母作为输入。 我已经尝试过使用matchs方法,但是不幸的是出了点问题,并且抛出了异常。 还有其他检查方法吗? 问题答案: 您可以尝试使用此正则表达式

  • 问题内容: 我正在将Primefaces 3.2与JSF 2.0一起使用。 我正在使用 而对于ajaxStatus: 我在同一页面上还有很多其他primefaces组件,但是我只希望在按下此特定按钮时呈现p:ajaxStatus。有什么好的解决办法吗?ajaxStatus在每个ajax事件上呈现。 问题答案: 如果您有少量按钮,则可以对其进行设置,然后在不进行此设置的情况下保留所需的按钮。 这样,

  • 问题内容: 我有以下结构: 该方法 可以 被许多线程同时调用。该 会 抛出异常(它在后台,可能成为过时的使用一些数据)。 如果引发异常,则执行一些耗时的任务,比如说“更新”所有当前数据,并且我可以调用。 问题: 如何确保只调用 一次 ?如果我在的条目中放置了原子标志,则不能确定何时清除该标志。 我该如何解决?请注意:由于它是一个外部API,因此我无法修改,并且我正在使用装饰器模式来使用它。 问题答