RMI主要可以理解為遠(yuǎn)程調(diào)用。第三個是真正執(zhí)行計算的實體,第二個是第三個對外公開的總代理商,第一個就是零售商。

成都創(chuàng)新互聯(lián)主營江源網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,江源h5微信小程序開發(fā)搭建,江源網(wǎng)站營銷推廣歡迎江源等地區(qū)企業(yè)咨詢
首先要選用技術(shù),這很明顯做個socket就行,簡單通訊,還可以擴展為非局域網(wǎng)的主機。
1,編寫socket服務(wù)器端 放在主服務(wù)器上,利用開機啟動的方式啟動server
并保持監(jiān)聽某端口
2,編寫socket客戶端放在 你需要的從屬服務(wù)器上,同樣利用開機啟動的方式
運行client,然后程序中利用 經(jīng)過包裝client.getOutputStream()的流,向服務(wù)器發(fā)送消息,就是那個ip (當(dāng)字符串發(fā),轉(zhuǎn)換為byte[])
(細(xì)節(jié)我就不介紹了…… )
3,匯總的實質(zhì)就是 server 利用
client.getInputStream()的包裝流(假如叫in)
存放數(shù)據(jù)的數(shù)組,假如叫 bytep[] buf;
獲得數(shù)據(jù) in.read(buf,0,buf.length);
然后:
File file = new File("D://log.txt");//假如是你要的log文件
FileInputStream fis =new FileInputStream(file);
fis.write(buf);
這樣就搞定了
細(xì)節(jié)注意點:由于log文件需要保留舊數(shù)據(jù),所以寫文件的時候要注意選用Acess流進行插入。另外,當(dāng)從屬服務(wù)器關(guān)閉的時候,也要發(fā)個信息過來,把對應(yīng)的ip刪除掉哦!
給我分唄
RMI的開發(fā)步驟
先創(chuàng)建遠(yuǎn)程接口及聲明遠(yuǎn)程方法,注意這是實現(xiàn)雙方通訊的接口,需要繼承Remote
開發(fā)一個類來實現(xiàn)遠(yuǎn)程接口及遠(yuǎn)程方法,值得注意的是實現(xiàn)類需要繼承UnicastRemoteObject
通過javac命令編譯文件,通過java -server 命令注冊服務(wù),啟動遠(yuǎn)程對象
最后客戶端查找遠(yuǎn)程對象,并調(diào)用遠(yuǎn)程方法
首先為服務(wù)建立一個Model層,注意因為此對象需要現(xiàn)實進行遠(yuǎn)程傳輸,所以必須繼承Serializable
代碼?
package?rmi.model;
import?java.io.Serializable;
//注意對象必須繼承Serializable
publicclass?PersonEntity?implements?Serializable?{
privateint?id;
private?String?name;
privateint?age;
publicvoid?setId(int?id)?{
this.id?=?id;
}
publicint?getId()?{
return?id;
}
publicvoid?setName(String?name)?{
this.name?=?name;
}
public?String?getName()?{
return?name;
}
publicvoid?setAge(int?age)?{
this.age?=?age;
}
publicint?getAge()?{
return?age;
}
}
創(chuàng)建遠(yuǎn)程接口PersonService,注意遠(yuǎn)程接口需要繼承Remote
代碼
package?rmi.service;
import?java.rmi.Remote;
import?java.rmi.RemoteException;
import?java.util.List;
import?rmi.model.*;
//此為遠(yuǎn)程對象調(diào)用的接口,必須繼承Remote類
publicinterface?PersonService?extends?Remote?{
public?ListPersonEntity?GetList()?throws?RemoteException;
}
建立PersonServiceImpl實現(xiàn)遠(yuǎn)程接口,注意此為遠(yuǎn)程對象實現(xiàn)類,需要繼承UnicastRemoteObject
代碼
package?rmi.serviceImpl;
import?java.rmi.RemoteException;
import?java.rmi.server.UnicastRemoteObject;
import?java.util.LinkedList;
import?java.util.List;
import?rmi.model.PersonEntity;
import?rmi.service.*;
//此為遠(yuǎn)程對象的實現(xiàn)類,須繼承UnicastRemoteObject
publicclass?PersonServiceImpl?extends?UnicastRemoteObject?implements?PersonService?{
public?PersonServiceImpl()?throws?RemoteException?{
super();
//?TODO?Auto-generated?constructor?stub
}
@Override
public?ListPersonEntity?GetList()?throws?RemoteException?{
//?TODO?Auto-generated?method?stub
System.out.println("Get?Person?Start!");
ListPersonEntity?personList=new?LinkedListPersonEntity();
PersonEntity?person1=new?PersonEntity();
person1.setAge(25);
person1.setId(0);
person1.setName("Leslie");
personList.add(person1);
PersonEntity?person2=new?PersonEntity();
person2.setAge(25);
person2.setId(1);
person2.setName("Rose");
personList.add(person2);
return?personList;
}????
}
建立服務(wù)器端,在服務(wù)器端注冊RMI通訊端口與通訊路徑,然后通訊javac命令編譯文件,通過java -server 命令注冊服務(wù)。以下面代碼為例,如果閣下將項目建立于D:\\RMI\RemotingService文件夾上時,則先輸入D:\\RMI\RemotingService\srcjavac rmi/remotingservice/Program.java獲取Program.class(如何閣下使用的MyEclipse等開發(fā)工具,可跳過此步,直接在*/bin文件夾中直接調(diào)用已經(jīng)生成的Program.class),然后輸入D:\\RMI\RemotingService\srcjava rmi/remotingservice/Program啟動服務(wù)。
代碼
package?rmi.remotingservice;
import?java.rmi.Naming;
import?java.rmi.registry.LocateRegistry;
import?rmi.service.*;
import?rmi.serviceImpl.*;
publicclass?Program{
publicstaticvoid?main(String[]?args)?{
try?{
PersonService?personService=new?PersonServiceImpl();
//注冊通訊端口
LocateRegistry.createRegistry(6600);
//注冊通訊路徑
Naming.rebind("rmi://127.0.0.1:6600/PersonService",?personService);
System.out.println("Service?Start!");
}?catch?(Exception?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
}
最后建立客戶端進行測試,注意客戶調(diào)用的RMI路徑必須服務(wù)器配置一致
代碼?
package?rmi.remotingclient;
import?java.rmi.Naming;
import?java.util.List;
import?rmi.model.PersonEntity;
import?rmi.service.*;
publicclass?Program?{
publicstaticvoid?main(String[]?args){
try{
//調(diào)用遠(yuǎn)程對象,注意RMI路徑與接口必須與服務(wù)器配置一致
PersonService?personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
ListPersonEntity?personList=personService.GetList();
for(PersonEntity?person:personList){
System.out.println("ID:"+person.getId()+"?Age:"+person.getAge()+"?Name:"+person.getName());
}
}catch(Exception?ex){
ex.printStackTrace();
}
}
}
常見錯誤
在命令提示符調(diào)用java命令時,顯示并無此命令。這是因為未在“環(huán)境變量”中綁定JAVA的JDK命令造成的,你首先單擊“計算機右鍵”-“屬性”-“高級”-“環(huán)境變量”。在系統(tǒng)變量Path設(shè)置中加載為JDK的路徑? .;D:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin。然后在ClassPath加載服務(wù)器端的Program.class地址 .;D:\\RMI\RemotingService\bin
在調(diào)用javac命令時出現(xiàn)“javac 找不到文件 ..... ”此錯誤,可能是因為閣下輸入的文件路徑出現(xiàn)錯誤造成,注意不要把D:\\RMI\RemotingService\srcjavac rmi/remotingservice/Program.java寫錯為D:\\RMI\RemotingService\srcjavac rmi.remotingservice.Program.java
在調(diào)用D:\\RMI\RemotingService\binjava rmi/remotingservice/Program命令時出現(xiàn)“Exception in thread 'main' java.lang.NoClassEdfoundError”錯誤,第一這可能是閣下把Program錯寫為Program.class,注意java命令不需要加后綴名。第二可能是閣下把“java rmi/remotingservice/Program”錯寫為“java rmi\remotingservice\Program"。
當(dāng)前題目:javarmi實現(xiàn)代碼 java開發(fā)代碼
本文路徑:http://www.yijiale78.com/article4/doddpie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、、網(wǎng)站策劃、標(biāo)簽優(yōu)化、云服務(wù)器、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)