【问题标题】:Bind address and port to RMI将地址和端口绑定到 RMI
【发布时间】:2017-04-28 16:48:54
【问题描述】:

我正在开发一个聊天,首先我使用套接字和流在服务器和客户端之间进行通信,我已经和我的朋友一起测试过它并且它有效。现在我正在尝试转换为 RMI。

所以,它在本地工作,但是当我的朋友尝试连接时,他的连接被拒绝。奇怪的是它显示了服务器本地ip(192.168.25.28)。

我的代码如下所示:

    public void conectar() throws RemoteException, MalformedURLException, NotBoundException{
    // COMUNICADOR SERVIDOR (USADO PELO CLIENTE)
    comunicadorServidor = new ComunicadorServidor(id); // cria um novo comunicador
    LocateRegistry.createRegistry(8081); // inicia o registro RMI na porta 8081
    Naming.rebind("//:8081/ComunicadorServidor", comunicadorServidor); // vincula o objeto comunicador ao endereço RMI
    // COMUNICADOR CLIENTE (USADO PELO SERVIDOR)
    comunicador = (IComunicadorCliente) Naming.lookup("//" + conexao.getInetAddress().getHostAddress() + ":8082/ComunicadorCliente"); // procura o comunicador no cliente
}

所以我在服务器和客户端都使用 RMI,并且一个相互连接,因为在服务器中我有客户端使用的身份验证和发送消息等方法,而在客户端我有更新用户列表和接收等方法消息,服务器使用。

首先我创建一个 RMI 类的实例(服务器端),在端口 8081 上创建一个注册表,然后将该对象绑定到端口 8081,名称为“ComunicadorServidor”。

然后服务器尝试连接到客户端 RMI。

所以我读到了 rebind 方法,如果我不指定地址,它会绑定到本地主机地址,我问:即使它绑定到我的本地机器,它在外面是否仍然可用?如果没有,我如何将它绑定到与套接字相同的位置,我只需指定一些端口,它将可用于任何地址,如 localhost、本地 ip 或外部 ip。

关于查找,获取客户端 IP 的最佳方法是什么(现在我正在从套接字获取),我如何确定我将获得正确的 IP?我可以在没有套接字的情况下连接到客户端 RMI 吗?

在客户端它本质上是一样的,除了它将 RMI 类绑定到 8082 并使用提供的 IP 和端口在服务器端查找 RMI 类。

【问题讨论】:

    标签: java sockets binding chat rmi


    【解决方案1】:

    奇怪的是它显示了服务器本地ip(192.168.25.28)。

    没错。如果您需要它出现在公共 IP 地址上,您需要查找 java.rmi.server.hostname,并参见 RMI 常见问题解答中的 A.1 项。

    所以我看了rebind方法,如果我不指定地址,它会绑定到本地主机地址,我问:即使绑定到我的本地机器,在外面还能用吗?

    如果服务器端防火墙规则允许,外部世界可以使用注册表。请注意,RMI 意义上的bind 仅表示将远程对象与注册表中的名称相关联:它与Socket.bind() 无关。

    关于查找,获取客户端 IP 的最佳方法是什么(现在我正在从套接字获取),我如何确定我将获得正确的 IP?我可以在没有套接字的情况下连接到客户端 RMI 吗?

    您根本无法在 RMI 中“连接”,但您不需要客户端的 IP 地址。客户端应通过服务器远程方法向服务器注册其远程对象,例如register(Client client) throws RemoteException。然后服务器有一个存根,它可以直接调用客户端远程方法(客户端防火墙允许)。

    【讨论】:

    • 我只是在阅读您所说的内容。看起来不错,使用自己的远程对象将一些对象导出到服务器,聪明。我明天试试,在这里告诉你。
    • 成功了,非常感谢!我从服务器应该从客户端获取的类中删除了 Unicast 的扩展,所以我可以使用 exporteObject 方法,它工作得很好!
    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2012-07-24
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多