java - 如何在 RMI 中正确注册服务器上的客户端?

标签 java client-server rmi

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

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

其中 theServer 是对将充当系统服务器的对象的引用,SERVER_NAME 只是一个静态 String,用于表示服务器。如图所示,注册表将服务器绑定(bind)到端口 4051,以便客户端可以查询它。现在我正在研究服务器和多个客户端实例(12 个教师运行同一客户端程序)之间的交叉通信,目前它的设置是客户端将自己的 stub 发送到客户端的服务器注册。

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

其中INTERFACE_Client扩展了Remote接口(interface),并且通过调用以下方式发送客户端:

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

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

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

最佳答案

I just chose port 4052 because I didn't know what I was doing.

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

I also didn't bind the stub to a registry. Is a good way to do it?

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

Because I've hardcoded the client port, all 12 teachers will be exporting the object using port 4052 (at least that's how I see it) from their respective client instances.

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

Should the ports be randomized?

除非每个 TCP 主机有 > 1 个客户端。

Should I not include a port (there's a method that doesn't require that as well)?

没有。

Any helpful hints would be greatly appreciated.

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

关于java - 如何在 RMI 中正确注册服务器上的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584710/

相关文章:

java - 改造。如果 (!response.isSucessful()) 得到响应

java - java中如何获取系统当前的日期和时间

java - 在java套接字编程聊天应用程序中,是否可以为每个客户端创建单独的聊天,例如whatsapp?

java - 序列化和 RMI

java - RMI异常: proxy cannot be cast to remote object

java - Spring分布式事务涉及RMI调用可能吗?

java - 无法在 "/usr/bin/java/bin/java"(-1) 找到可执行文件

java - 根据用户输入和已知字段创建查询

http - 对HTTP协议(protocol)感到困惑

Java - 关于套接字: how to change thread without rebooting server