我正在开发一个聊天,首先我使用套接字和流来在服务器和客户端之间进行通信,我已经和朋友一起测试过它了。现在我试图转换为RMI。
所以,它在本地工作,但是当我的朋友尝试连接时,他会被拒绝连接。 Weirder是它显示服务器本地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上创建一个注册表,然后将该对象绑定到名为" ComunicadorServidor"的端口8081。
然后服务器尝试连接到客户端RMI。
所以我读到了重新绑定方法,如果我没有指定地址,它将绑定到本地主机地址,我问:即使它绑定到我的本地机器,也是它还在外面吗?如果没有,我如何将它与套接字绑定在一起,我只是指定一些端口,它可用于任何地址,如localhost,本地ip或外部ip。
关于查找,获取客户端IP的最佳方法是什么(现在我从套接字中取出),我怎样才能确定我能获得正确的IP?我可以在没有套接字的情况下连接到客户端RMI吗?
在客户端,它本质上是相同的,除了它将RMI类绑定到8082并使用提供的IP和端口在服务器端查找RMI类。
答案 0 :(得分:0)
Weirder显示服务器本地ip(192.168.25.28)。
这是对的。如果您需要它显示在公共IP地址上,您需要查找java.rmi.server.hostname
,并参阅RMI常见问题解答中的项目A.1。
所以我读到了重新绑定方法,如果我没有指定地址,它将绑定到本地主机地址,我问:即使它绑定到我的本地机器,它是否仍可在外部使用? / p>
如果服务器端防火墙规则允许,则注册表可供外界使用。请注意,RMI意义上的bind
只意味着将远程对象与注册表中的名称相关联:它与Socket.bind()
无关。
关于查找,获取客户端IP的最佳方式是什么(现在我从套接字中获取),我怎样才能确定我将获得正确的IP?我可以在没有套接字的情况下连接到客户端RMI吗?
您根本无法在RMI中“连接”,但您不需要客户端的IP地址。客户端应该通过服务器远程方法向服务器注册其远程对象,例如, register(Client client) throws RemoteException
。然后服务器有一个存根,可以直接调用客户端远程方法(客户端防火墙允许)。