java rmi 使用管道_使用Java RMI时要记住的两件事
java rmi 使用管道
這是一篇簡短的博客文章,介紹使用Java RMI時應注意的兩個常見陷阱。
設置java.rmi.server.hostname
如果您感到陌生,Connection拒絕托管: RMI客戶端上的錯誤消息,并且您確定連接應該正常工作(您仔細檢查了所有標準配置,例如網絡配置等)。RMI系統屬性java.rmi.server.hostname值得研究。
要在遠程對象上調用方法,RMI客戶端首先必須從RMI注冊表中檢索遠程存根對象。 此存根對象包含服務器地址,該服務器地址稍后將在應調用遠程方法時用于連接到遠程對象(與RMI注冊表的連接和與遠程對象的連接是兩個完全不同的東西)。 默認情況下,服務器將嘗試檢測自己的地址并將其傳遞給存根對象。 不幸的是,用于檢測服務器地址的算法并不總是產生有用的結果(取決于網絡配置)。
通過在RMI服務器上設置系統屬性java.rmi.server.hostname,可以覆蓋傳遞給存根對象的服務器地址。
這可以用Java代碼完成
System.setProperty("java.rmi.server.hostname", "<<rmi server ip>>");或添加Java命令行參數:
-Djava.rmi.server.hostname=<<rmi server ip>>設置RMI服務端口
如果在通過防火墻進行RMI調用時遇到麻煩,則應確保為遠程對象設置了特定的端口。 默認情況下,RMI注冊表使用端口1099,因此請確保在防火墻中打開了此端口。 但是,此端口僅由客戶端用于連接到RMI注冊表,而不用于存根和遠程對象之間的通信。 對于后面的一個,默認情況下使用隨機端口。 由于您不想打開防火墻中的所有端口,因此應為RMI遠程對象設置特定的端口。
這可以通過重寫RMISocketFactory的createServerSocket()方法來完成:
public?class?MyRMISocketFactory?extends?RMISocketFactory?{private?static?final?int?PREFERED_PORT?=?1234;public?ServerSocket?createServerSocket(int?port)?throws?IOException?{if?(port?==?0)?{return?new?ServerSocket(PREFERED_PORT);}return?super.createServerSocket(port);} }默認情況下,如果將0作為參數傳遞,則createServerSocket()選擇一個空閑的隨機端口。 在createServerSocket()的此修改版本中,將0作為參數傳遞時,將返回特定端口(1234)。
如果您使用的是Spring的RmiServiceExporter,則可以使用setServicePort()方法在特定端口上導出服務:
<bean?class="org.springframework.remoting.rmi.RmiServiceExporter"><property?name="servicePort"?value="1234"/>... </bean> 請注意,多個遠程對象/服務可以共享同一端口。 設置特定端口后,只需在防火墻中打開此端口。
翻譯自: https://www.javacodegeeks.com/2013/11/two-things-to-remember-when-using-java-rmi.html
java rmi 使用管道
總結
以上是生活随笔為你收集整理的java rmi 使用管道_使用Java RMI时要记住的两件事的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 班子成员备案流程(班子成员备案)
- 下一篇: (linux no gui)