1

我目前正在从事一个小项目,该项目管理我正在帮助运行的暑期项目的出勤率。RMI 服务器从办公室运行,并使用以下代码为其设置了特定端口:

Registry registry = LocateRegistry.createRegistry(4051);
RemoteManager stub = (RemoteManager) UnicastRemoteObject.exportObject(theServer, 4051);
registry.rebind(SERVER_NAME, stub);

wheretheServer是对将用作系统服务器的对象的引用,并且SERVER_NAME只是String用于表示服务器的静态变量。如图所示,注册表将服务器绑定到端口4051,以便客户端可以查询它。现在我正在处理服务器和多个客户端实例之间的交叉通信(12 位教师运行相同的客户端程序),目前设置为客户端将stubs自己发送到服务器以进行客户端注册。

public void registerClient(INTERFACE_Client teach) throws RemoteException {
.
.
.
}

whereINTERFACE_Client扩展了Remote接口,并通过调用将客户端发送下来:

server.registerClient((INTERFACE_Client) UnicastRemoteObject.exportObject(this, 4052));

我只是选择了端口4052,因为我不知道自己在做什么。我也没有将存根绑定到注册表。是一个好方法吗?因为我已经对客户端端口进行了硬编码,所以所有 12 位教师都将使用端口 4052(至少我是这么看的)从他们各自的客户端实例中导出对象。端口应该随机化吗?我应该不包括端口(有一种方法也不需要)?任何有用的提示将不胜感激。

作为免责声明,我确实需要在服务器中引用客户端,以便办公室的人可以向老师发送消息。(服务器 -> 客户端通信)。客户端已经拥有对服务器的引用,因为它可以在注册表中查找它。
有什么建议吗?

4

1 回答 1

0

我只是选择了 4052 端口,因为我不知道自己在做什么。

没关系,只要4052端口在两个中间防火墙中双向开放,如果有防火墙的话。没有真正的理由不能在两端使用 RMI 注册端口 1099:它已经被 IANA 保留,除非主机已经包含一些其他 RMI 应用程序。

我也没有将存根绑定到注册表。是一个好方法吗?

没关系。您不需要在客户端注册。您只需要现有的注册 API。

因为我已经硬编码了客户端端口,所以所有 12 位教师都将使用端口 4052(至少我是这样认为的)从他们各自的客户端实例中导出对象。

只要“客户端实例”都是独立的 TCP 主机,就可以了。

端口应该随机化吗?

除非每个 TCP 主机有 > 1 个客户端,否则不会。

我应该不包括端口(有一种方法也不需要)?

不。

任何有用的提示将不胜感激。

您的客户端必须实现远程接口并导出,然后通过您现有的 API 向服务器注册。你做得很好。只要没有防火墙,或者它们都在您的控制之下,您就可以了。

于 2013-07-11T08:15:43.163 回答