轉載請表明出處: http://blog.csdn.net/jiangsq12345
對JavaRMI的介紹我就省略了,本文主要是協助大家解決一個常見的在運行RMI過程中出現的煩人Exception(特別是Stub not found)。
開始前先提醒幾點:
1對於.編寫代碼,我想大家差不多都用的是Eclipse這個IDE,但是對於運行RMI用IDE反而麻煩,所以先做好用命令編譯運行java程式的準備 (一般要3個命令視窗,分別是伺服器
+用戶端
+RMI註冊程式rmiregistry
)
2.網上有很多教程是寫一部分代碼編譯最後再運行,而我覺得編寫代碼需要連貫性,因此我提倡先寫代碼,然後運行RMI; j建議大家先從最簡單的例子開始:
4個類(3個在伺服器端,1個在用戶端); 將這3個類放在同一個包下面,或者如果你不太懂包的含義乾脆就預設不用包
。
先瞭解一下RMI的大致步驟:
1. 建立遠程介面及聲明遠程方法(HelloInterface.java)
2. 實現遠程介面及遠程方法(繼承UnicastRemoteObject)(Hello.java)
3. 用戶端尋找遠程對象,並調用遠程方法(HelloClient)
4. 啟動RMI註冊服務,並註冊遠程對象(HelloServer.java)
5. 執行程式:啟動服務HelloServer;運行用戶端HelloClient進行調用
代碼參考 http://topic.csdn.net/u/20090306/22/060e1a70-8d4a-47e9-987c-11637d6d7e7f.html
,我省略
我們重點來說一下編譯和運行中的步驟及注意點:
假設我們代碼的結構是這樣的
+projet
+src
+test(包)
- HelloInterface.java
- Hello.java
- HelloServer.java
-HelloClient.java
1. 編譯代碼
進入到 ....../workspace/projet/src
檔案夾下 (省略符號表示你的系統的絕對路徑),先給環境變數加一條預設的classpath,
Linux下: export CLASSPATH='....../workspace/projet/src
';
Windows 下可以考慮用手動右擊我的電腦手動設定
然後 用命令(前提是你的電腦已經設定好java虛擬機器的路徑,否則先把這個設定好):
$Javac *.java
2. 用RMIC產生一個stub類
命令(注意到包與類名用.
串連,而且不用.class):
$rmic test.Hello
3. 運行rmiregistry,
用另一個視窗運行命令:
$rmiregistry
4. 運行伺服器(我記得早些版本不用再設定路徑就可以直接找到stub的,但是現在好像不行了,不管怎麼樣加個路徑中沒有錯的)
要在....../workspace/projet/src目錄下
$java -Djava.rmi.server.codebase=file:/....../workspace/projet/src/ test.HelloServer
5. 運行用戶端
要在....../workspace/projet/src目錄下
$java test.HelloClient
如果沒有其他意外的話,應該可以看到helloworld了。如還有問題可以給在我留言
註:
1. 用RMI傳遞對象時,必須將對象序列化
2.
rmiregistry
預設連接埠是1099,因此注意伺服器端發布服務是連接埠必須要於此連接埠一致,否則無法完成註冊;會有Connection refuse的exception
3. 如果項目比較大,代碼大時,可以用Ant
, 例子
<project name="projet" default="compile"></p><p><property name="src" value="${basedir}/src" /><br /><property name="bin" value="${basedir}/bin" /></p><p> <path id="classpath"><br /><fileset dir="${bin}" includes="*.class" /><br /></path> </p><p><!-- =========== --><br /><!-- Compilation --><br /><!-- =========== --></p><p><target name="compile" description="Compile le projet"><br /><mkdir dir="${bin}" /><br /><javac destdir="${bin}" srcdir="${src}" classpathref="classpath" /><br /></target></p><p><!-- ========================= --><br /><!-- Nettoyage des répertoires --><br /><!-- ========================= --></p><p><target name="clean" description="Nettoyage des répertoires"><br /><delete dir="${bin}" /><br /></target></p><p></project>