簡體   English   中英

將地址和端口綁定到RMI

[英]Bind address and port to RMI

我正在建立一個聊天室,首先我使用套接字和流在服務器和客戶端之間進行通信,我已經與朋友們進行了測試,並且可以正常工作。 現在,我正在嘗試轉換為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,並且它們彼此連接,因為在服務器中,我使用了諸如Authentication和Send Message之類的方法,客戶端使用了該方法,而在客戶端中,我具有了諸如更新用戶列表和接收消息的方法。服務器使用。

因此,首先我創建一個RMI類的實例(服務器端),在端口8081上創建一個注冊表,然后將該對象綁定到名稱為“ ComunicadorServidor”的端口8081。

之后,服務器嘗試連接到客戶端RMI。

因此,我了解了rebind方法,如果不指定地址,它將綁定到本地主機地址,我會問:即使綁定到我的本地計算機,它在外部仍然可用嗎? 如果沒有,我該如何將其綁定到與套接字相同的位置,只需在其中指定一些端口,該端口即可用於任何地址,例如localhost,本地ip或外部ip。

關於查找,獲取客戶端IP的最佳方法是什么(現在我要從套接字獲取),如何確定我將獲得正確的IP? 我可以在沒有套接字的情況下連接到客戶端RMI嗎?

在客戶端,本質上是同一件事,除了它將RMI類綁定到8082並使用提供的IP和端口在服務器端查找RMI類。

奇怪的是,它顯示了服務器的本地IP(192.168.25.28)。

沒錯 如果您需要將其顯示在公共IP地址上,則需要查找java.rmi.server.hostname ,並參閱RMI FAQ中的項目A.1。

因此,我了解了rebind方法,如果不指定地址,它將綁定到本地主機地址,我會問:即使綁定到我的本地計算機,它在外部仍然可用嗎?

如果服務器端防火牆規則允許,則注冊表可用於外部環境。 注意,從RMI的角度來說, bind只是意味着將遠程對象與注冊表中的名稱相關聯:與Socket.bind()無關。

關於查找,獲取客戶端IP的最佳方法是什么(現在我要從套接字獲取),如何確定我將獲得正確的IP? 我可以在沒有套接字的情況下連接到客戶端RMI嗎?

您根本無法在RMI中“連接”,但不需要客戶端的IP地址。 客戶端應通過服務器遠程方法向服務器注冊其遠程對象,例如register(Client client) throws RemoteException 然后,服務器具有一個存根,可以在存根上直接調用客戶端遠程方法(客戶端防火牆允許)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM