導航:首頁 > 編程語言 > javarmi參數要求

javarmi參數要求

發布時間:2023-07-14 21:43:36

㈠ 哪些埠是通過java RMI連接使用

第一步:創建一個遠程對象介面

import java.rmi.Remote;
import java.rmi.RemoteException;

/*
* 這個介面繼承自Remote,每一個定義的方法都必須拋出一個RemoteException異常對象
* 我們可供遠程調用的方法就是通過這里開公開
*/ public interface IRMI extends Remote{
public String invoke() throws RemoteException;
} 12345678910

第二步:創建介面的具體實現類

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/*
* 遠程對象的實現
* 公開方法的具體實現就是這里定義的
*/ public class IRMIImpl extends UnicastRemoteObject implements IRMI {

protected IRMIImpl() throws RemoteException {
super(); // 這個實現必須有一個顯式的構造函數,並且要拋出一個RemoteException異常
}

private static final long serialVersionUID = 6131922116577454476L;

public String invoke() throws RemoteException { //該方法公開
return "hello,world!";
}

public String tryInvoke() throws RemoteException{ //該方法未公開,若要公開請在介面中定義
return "try to remote me";
}
}

第三步:創建RMI伺服器

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/*
* 遠程對象的注冊類 該類應該在伺服器端執行,執行之後
* 該機器將變為RMI伺服器 客戶端可以通過正確的url來訪問
* 伺服器上的遠程對象,執行對外報露的方法
*/ public class RMIServer {
static int port = 8888;

/*
* 創建一個Registry對象.
* LocateRegistry用於獲取名字服務或創建名字服務.
* 調用LocateRegistry.createRegistry(int port)方法可以在某一特定埠創建名字服務,從而用戶無需再手工啟動rmiregistry
* @return 返回一個Registry對象
*/
private static Registry createRegistry() {
Registry registry = null;
try {
registry = LocateRegistry.getRegistry(port); //如果該埠未被注冊,則拋異常
registry.list(); //拿到該埠注冊的rmi對象
} catch (final Exception e) {
try {
registry = LocateRegistry.createRegistry(port);//捕獲異常,埠注冊
} catch (final Exception ee) {
ee.printStackTrace();
}
}
return registry;
}

/**
* 將對象注冊到rmi伺服器上
*/
public static void bind() {
Registry registry = createRegistry();
try {
IRMIImpl impl = new IRMIImpl();
registry.rebind("mytask", impl); //這就是綁定,client里lookup必須和"mytast"一樣才能遠程調用impl
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
bind();
} catch (Exception e) {
e.printStackTrace();
}
}
}

上面是一種比較好的寫法,如果只是要測試,可以直接在main()方法中寫:

ImplementClass ic = new ImplementClass(); //具體實現類
Registry r = LocateRegistry.createRegistry(8888);
r.bind("mytask", ic);
//Naming.rebind("rmi://localhost:8888/mytask", ic); 可替換上句 1234

1.注冊一個埠 2.在注冊埠綁定taskName和implementClass 3.客戶端就可以通過url和taskName來找到implementClass。

第四步:創建RMI客戶端

import java.rmi.Naming;

public class RMIClient {
/**
* 調用遠程對象中的方法
* @throws Exception
*/
public static void getRemoteObject() throws Exception{

/*得到遠程發布的服務
返回與指定 name 關聯的遠程對象的引用(一個stub)*/
IRMI obj = (IRMI)Naming.lookup("rmi://localhost:"+RMIServer.port+"/mytask"); //註:通過介面拿

System.out.println(obj.invoke()); //調用遠程服務的方法
}

public static void main(String[] args) {
try {
getRemoteObject();
} catch (Exception e) {
e.printStackTrace();
}
}
} 24

運行RMI系統:啟動RMI伺服器,啟動客戶端即可。

㈡ Java RMI調用遠程程序拋出異常

背景要求:定時監控遠程主機上mongodb資料庫內存使用的情況,當內存使用過大時暫停邏輯處理線程後啟動內存空間的釋放處理線程,釋放完成後再啟動邏輯處理線程。
操作系統:CentOS 64bit (Linux)
步驟(代碼省略):
1.創建Socket遠程伺服器
2.創建客戶端
配置:
#查找對象stub埠
RMI_PORT=9902
#服務埠
RMI_SERV_RMI_PORT=9903
#注冊服務地址埠要和查找對象stub埠一致
RMI_URL=rmi://192.168.0.118:9902/MongoServer
#綁定IP
RMI_IP=192.168.0.118
#檢查內存shell
RMI_MEMQUERY_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memquery.sh
#釋放內存shell
RMI_MEMFREE_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memclear.sh
#釋放內存容量閥值,單位M
RMI_MEM_CAPACITY_LIMIT=3000
3.啟動伺服器
客戶端線程通過 rmi://192.168.0.118:9902/MongoServer 訪問時出現異常:
--定時掃描MONGODB內存線程--:開始運行!
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:84)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:87)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
... 6 more
--定時掃描MONGODB內存線程--:處理結束!
=======================================================================================================
--定時掃描MONGODB內存線程--:開始運行!
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.0.118:9902 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at java.net.Socket.connect(Socket.java:524)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:84)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:89)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
--定時掃描MONGODB內存線程--:處理結束!
============================================================================================================
--定時掃描MONGODB內存線程--:開始運行!
java.security.AccessControlException: access denied (java.lang.RuntimePermission createSecurityManager)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.<init>(SecurityManager.java:282)
at java.rmi.RMISecurityManager.<init>(RMISecurityManager.java:45)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:88)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
--定時掃描MONGODB內存線程--:處理結束!

==========================================================================================================
以上異常都有可能出現,通過以下方式可解除問題:
1.在客戶端程序前打開安全管理器:
try {
System.setSecurityManager(new java.rmi.RMISecurityManager());
mds = (IMongoDBScan) Naming.lookup(urlStr);
} catch (MalformedURLException e) {
//..........
}
2.修改/usr/java/jdk1.6.0_21/jre/lib/security/java.policy後重啟
grant {
permission java.security.AllPermission;
}

㈢ java RMI是什麼意思啊

RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java 虛擬機上的對象專調用另一個 Java 虛擬機中的屬對象上的方法。可以用此方法調用的任何對象必須實現該遠程介面。調用這樣一個對象時,其參數為 "marshalled" 並將其從本地虛擬機發送到遠程虛擬機(該遠程虛擬機的參數為 "unmarshalled")上。該方法終止時,將編組來自遠程機的結果並將結果發送到調用方的虛擬機。如果方法調用導致拋出異常,則該異常將指示給調用方。

㈣ android 怎麼使用java rmi

1、定義一個遠程介面

IHello.java代碼如下:

importjava.rmi.Remote;

{

publicStringsayHello(Stringname)throwsjava.rmi.RemoteException;

}

2、實現遠程的介面(服務端就在此遠程介面的實現類中)

HelloImpl.java代碼如下:

importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;
{
//這個實現必須有一個顯式的構造函數,並且要拋出一個RemoteException異常
protectedHelloImpl()throwsRemoteException{
super();
}
/**
*說明清楚此屬性的業務含義
*/
=4077329331699640331L;
publicStringsayHello(Stringname)throwsRemoteException{
return"Hello"+name+"^_^";
}
publicstaticvoidmain(String[]args){
try{
IHellohello=newHelloImpl();
java.rmi.Naming.rebind("rmi://localhost:1099/hello",hello);
System.out.print("Ready");
}catch(Exceptione){
e.printStackTrace();
}
}
}

3、新建RMI客戶端調用程序

Hello_RMI_Client.java代碼如下:

importjava.rmi.Naming;
publicclassHello_RMI_Client{
publicstaticvoidmain(String[]args){
try{
IHellohello=(IHello)Naming.lookup("rmi://localhost:1099/hello");
System.out.println(hello.sayHello("zhangxianxin"));
}catch(Exceptione){
e.printStackTrace();
}
}
}

4、編譯並運行

4.1 用javac命令編譯IHello.java、HelloImpl.java、Hello_RMI_Client.java

>javac*.java

4.2用rmic命令生成樁和框架文件

>rmicHelloImpl

成功執行完上面的命令可以發現生成一個HelloImpl_stub.class文件,如果JDK是使用Java2SDK,那麼還可以發現多出一個HelloImpl_Skel.class文件。如果服務端程序與客戶端程序在同一台機器上並在同一目錄中,則可以省略掉介面實現類生成的樁和框架文件,但這就失去了使用RMI的意義,而如果要在不同的JVM上運行時,客戶端程序就必須得依靠服務端運程方法實現的樁和框架文件以及介面類。

4.3運行注冊程序RMIRegistry,必須在包含剛寫的類的目錄下運行這個注冊程序。

>rmiregistry

注冊程序開始運行了,不要管他,現在切換到另外一個控制台運行伺服器

4.4運行伺服器HelloImpl

>javaHelloImpl

當啟動成功出現Ready......這個伺服器就開始工作了,把介面的實現載入到內存等待客戶端的聯接。現在切換到第三個控制台,啟動我們的客戶端。

4.5啟動客戶端:為了在其他的機器運行客戶端程序你需要一個遠程介面(IHello.class)和一個stub(HelloImpl_Stub.class)。使用如下命令運行客戶端

>javaHello_RMI_Client

當運行成功會在控制台列印:Hellozhangxianxin(www.tiecou.com) ^_^

備註:如果不想在控制台上開啟RMI注冊程序RMIRegistry的話,可在RMI服務類程序中添加LocateRegistry.createRegistry(1099); 如下所示:

修改後的HelloImpl.java代碼如下:

importjava.rmi.RemoteException;
importjava.rmi.registry.LocateRegistry;
importjava.rmi.server.UnicastRemoteObject;
{
//這個實現必須有一個顯式的構造函數,並且要拋出一個RemoteException異常
protectedHelloImpl()throwsRemoteException{
super();
}

=4077329331699640331L;
publicStringsayHello(Stringname)throwsRemoteException{
return"Hello"+name+"^_^";
}
publicstaticvoidmain(String[]args){
try{
IHellohello=newHelloImpl();
LocateRegistry.createRegistry(1099);//加上此程序,就可以不要在控制台上開啟RMI的注冊程序,1099是RMI服務監視的默認埠
java.rmi.Naming.rebind("rmi://localhost:1099/hello",hello);
System.out.print("Ready");
}catch(Exceptione){
e.printStackTrace();
}
}
}

㈤ 什麼是 rmi

RMI採用JRMP(Java Remote Method Protocol)通訊協議,是構建在TCP/IP協議上的一種遠程調用方法。

更詳細請點擊:
http://www.hur.cn/web/program/java/JAVA06/200511/2377.html

閱讀全文

與javarmi參數要求相關的資料

熱點內容
淘寶賣二手的app叫什麼名字 瀏覽:217
安卓代碼讀取界面信息 瀏覽:714
數控車床車55度螺紋怎麼編程 瀏覽:391
word桌面找不到文件 瀏覽:585
數控車床編程怎麼做到的 瀏覽:639
哈爾濱市行政區劃代碼 瀏覽:716
如何顯示文件擴張 瀏覽:283
ps怎麼移植文件 瀏覽:443
傳奇補丁文件說明 瀏覽:513
奧維地圖怎麼設置網路疊加 瀏覽:407
linux載入庫文件so失敗 瀏覽:714
大家都想要的app 瀏覽:58
程序員比特幣 瀏覽:568
mysqlfrm是什麼文件 瀏覽:665
win10點擊文件夾聲音消失 瀏覽:963
蘋果手機空白文件名 瀏覽:833
linuxmv覆蓋合並文件夾 瀏覽:932
不開訪客網路怎麼聯網 瀏覽:631
win10的軟體卸載 瀏覽:779
crv汽車自帶網路怎麼打開 瀏覽:973

友情鏈接