日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java远程方法调用

發布時間:2024/9/30 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java远程方法调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要參考

http://www.kaixinwenda.com/article-yxc135-7690958.html

http://bbs.chinaunix.net/thread-1179312-1-1.html


Java 遠程處理?
   Java遠程方法調用(RMI)提供了Java程序語言的遠程通訊功能,這種特性使客戶機上運行的程序可以調用遠程服務器上的對象,使Java編程人員能夠在網絡環境中分布操作。?
   創建一個簡單的Java分布式遠程方法調用程序可以按以下幾個步驟操作,?
  ?
  ?一、定義遠程接口:?
   在 Java 中,遠程對象是實現遠程接口的類的實例, 遠程接口聲明每個要遠程調用的方法。在需要創建一個遠程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細節,客戶通過接口句柄發送消息即可。?
   遠程接口具有如下特點:?
   1) 遠程接口必須為public屬性。如果不這樣,除非客戶端與遠程接口在同一個包內,否則 當試圖裝入實現該遠程接口的遠程對象時,調用會得到錯誤結果。?
   2) 遠程接口必須擴展接口java.rmi.Remote。?
   3) 除與應用程序本身特定的例外之外,遠程接口中的每個方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。(或 RemoteException 的父類)。?
   4) 作為參數或返回值傳遞的一個遠程對象(不管是直接,還是本地對象中嵌入)必須聲明為遠 程接口,而不應聲明為實施類。?


下面是遠程接口的定義

package test; import java.rmi.Remote; import java.rmi.RemoteException; import java.math.BigInteger;public interface Fib extends Remote {public int getFib(int n) throws RemoteException; // public BigInteger getFib(BigInteger n) throws RemoteException; }
二、實現遠程接口: ?
   遠程對象實現類必須擴展遠程對象java.rmi.UnicastRemoteObject類,并實現所定義的遠程接口。遠程對象的實現類中包含實現每個遠程接口所指定的遠程方法的代碼。這個類也可以含有附加的方法,但客戶只能使用遠程接口中的方法。因為客戶是指向接口的一個句柄,而不是它的哪個類。必須為遠程對象定義構造函數,即使只準備定義一個默認構造函數,用它調用基礎類構造函數。因為基礎類構造函數可能會拋出 java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。?
   以下是遠程對象實現類的聲明:

package test; import java.math.BigInteger; import java.rmi.*; import java.rmi.server.UnicastRemoteObject;public class FibImp extends UnicastRemoteObject implements Fib {public FibImp() throws RemoteException {super();}public int getFib(int n) throws RemoteException {return n+2;}}
? 三、編寫服務器類: ?
   包含 main 方法的類可以是實現類自身,也可以完全是另一個類。下面通過RmiSampleServer 來創建一個遠程對象的實例,并通過java.rmi.registry.LocateRegistry類的createRegistry 方法從指定端口號啟動注冊服務程序,也可以通過執行 rmiregistry 命令啟動注冊服務程序,注冊服務程序的缺省運行端口為 1099。必須將遠程對象名字綁定到對遠程對象的引用上: Naming.rebind("//localhost:8808/SAMPLE-SERVER" , Server);?
   以下是服務器類的聲明:


package test; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class FibonacciServer {/*** @param args*/public static void main(String[] args) {try {LocateRegistry.createRegistry(8804); FibImp f = new FibImp();// 注冊到 registry 中Naming.rebind("//localhost:8804/SAMPLE-SERVER", f);System.out.println("fib server ready");} catch (RemoteException re) {System.out.println("Exception in FibonacciImpl.main: " + re);} catch (MalformedURLException e) {System.out.println("MalformedURLException " + e);}} }
? 四、編寫使用遠程服務的客戶機類:
   客戶機類的主要功能有兩個,一是通過Naming.lookup方法來構造注冊服務程序 stub 程序實例,二是調用服務器遠程對象上的遠程方法。?
   以下是客戶端類的聲明:

package testClient;import test.Fib; import java.math.BigInteger; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; public class FibClient {/*** @param args*/public static void main(String[] args) {String url = "//localhost:8804/SAMPLE-SERVER";try {Fib calc = (Fib) Naming.lookup(url);for (int i = 0; i < 10; ++i) {int f = calc.getFib(i);System.out.println(f);}} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();} catch (NotBoundException e) {e.printStackTrace();}} }
之前一直在eclipse下開發,對java的命令行編譯,運行不是很清楚,下面的編譯耗費了很多時間。

在包外面進行編譯

javac test/*.java

javac testClient/*.java


使用rmic編譯stub文件,在jdk1.5以后,利用java的reflect機制,因此就不會生成skeleton文件了

在windows下

運行rmic -classpath . test.FibImp,即可生成FibImp_Stub.class

在linux總是提示:/test/FibImp.class 中的類文件格式無效。 ?major.minor 版本 "51.0" 太新,此工具無法識別。

還需要排查


啟動rmiregistry

直接輸入rmiregistry即可


運行服務器:

java test.FibonacciServer


運行客戶機:

java testClient.FibClient



下面是用實驗室的Linux服務器的操作過程

一臺服務器編譯沒有問題,但是在rmic生成存根class時,出現的問題很蹊蹺,網上也搜不到:

error: ./test/FibImp.class 中的類文件格式無效。 ?major.minor 版本 "51.0" 太新,此工具無法識別。
error: 未找到類 test.FibImp。

這類錯誤出現的原因是:?major.minor 就像是我們可以這么想像,同樣是微軟件的程序,32 位的應用程序不能拿到 16 位系統中執行那樣。


參見 http://www.blogjava.net/Jay2009/archive/2009/04/23/267108.html


好吧,那就再換一臺linux服務器


編譯就有問題,應該是環境變量的問題,在javac 之后添加?-classpath . 即可


javac -classpath . testClient/FibClient.java?


生成存根

rmic -classpath . test.FibImp



在運行程序的時候也要在java 后面添加-classpath .



總結

以上是生活随笔為你收集整理的Java远程方法调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。