方法(一):利用java.rmi.registry.LocateRegistry實現RMI調用
1.創建遠程接口
遠程接口中聲明了可以被客戶程序訪問的遠程方法。只要一個類繼承了java.rmi.Remote接口,該對象才能成為遠程對象,對象中指定的方法才能被遠程調用。
2.實現遠程接口
3.生成存根(Stub)
這是運行前的截圖:
A.先javac編譯文件
B.然后生成存根
C.將存根放到客戶端里
4.啟動服務器程序
先start rmiregistry(如果代碼中沒有自帶的啟動服務的部分),后Java HelloServer(在Server文件夾下)
5.運行客戶端程序
方法(二):利用javx.naming.Context實現RMI調用
- 將服務器代碼和客戶端代碼進行更改,改變成使用naming.Context類的新代碼,並編譯
- 然后分別運行客戶端和服務器端
簽到系統實現
運行截圖:
1.啟動服務器
2.啟動客戶端
學生版:
老師版:
3.提交簽到信息
學生顯示:
老師顯示:
4.查看數據是否存儲
完成!
javax.naming.Context 與java.rmi.registry.LocateRegistry的區別
- Naming類只是在“遠程對象注冊表”上進行存儲和讀取操作,該類並不能創建“遠程對象注冊表”;
- LocateRegistry類可以獲取“遠程對象注冊表”引用,或者創建本地主機上的“遠程對象注冊表”;
- Naming類方法封裝了Registry接口方法,只需要一個URL就能對“遠程對象注冊表”進行相關操作。
- LocateRegistry類獲取到Registry對象引用后,通過Registry類方法對“遠程對象注冊表”進行相關操作
錯誤總結:
1.嘗試了不生成存根就啟動client,出現報錯
發現由於LocateRegistry 用於獲取特定主機(包括本地主機)上的遠程對象注冊表的引用,或用於創建一個接受對特定端口調用的遠程對象注冊表。
所以要從client本地獲取存根,所以用rmic生成存根並轉移到client文件夾中后,代碼正確運行。
2.rmic警告
仔細閱讀后發現只是建議不再使用,實際查看文件夾下已經生成了Stub文件,所以不存在硬性問題。
3.1099端口占用問題
在使用服務器端的時候,要運行“start rmiregistry”來啟動JDK自帶的注冊表程序,它用於保存Server類注冊的遠程對象並允許遠程客戶端的請求訪問。然后再運行服務器端的Server類,即“java Server”,該程序向注冊表中注冊具體的遠程對象。
但實際使用時出現了1099端口占用問題,打開了rmiregistry就無法啟動服務器端,用netstat -ano,列出所有端口的情況后,發現rmiregistry本身占用了1099端口,再查看代碼
所以代碼中已經包含啟動的部分,改進后並不需要手動啟動,所以就直接運行即可。