RMI主要可以理解為遠(yuǎn)程調(diào)用。第三個(gè)是真正執(zhí)行計(jì)算的實(shí)體,第二個(gè)是第三個(gè)對(duì)外公開的總代理商,第一個(gè)就是零售商。
成都創(chuàng)新互聯(lián)主營(yíng)江源網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,江源h5微信小程序開發(fā)搭建,江源網(wǎng)站營(yíng)銷推廣歡迎江源等地區(qū)企業(yè)咨詢
首先要選用技術(shù),這很明顯做個(gè)socket就行,簡(jiǎn)單通訊,還可以擴(kuò)展為非局域網(wǎng)的主機(jī)。
1,編寫socket服務(wù)器端 放在主服務(wù)器上,利用開機(jī)啟動(dòng)的方式啟動(dòng)server
并保持監(jiān)聽某端口
2,編寫socket客戶端放在 你需要的從屬服務(wù)器上,同樣利用開機(jī)啟動(dòng)的方式
運(yùn)行client,然后程序中利用 經(jīng)過(guò)包裝client.getOutputStream()的流,向服務(wù)器發(fā)送消息,就是那個(gè)ip (當(dāng)字符串發(fā),轉(zhuǎn)換為byte[])
(細(xì)節(jié)我就不介紹了…… )
3,匯總的實(shí)質(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é)注意點(diǎn):由于log文件需要保留舊數(shù)據(jù),所以寫文件的時(shí)候要注意選用Acess流進(jìn)行插入。另外,當(dāng)從屬服務(wù)器關(guān)閉的時(shí)候,也要發(fā)個(gè)信息過(guò)來(lái),把對(duì)應(yīng)的ip刪除掉哦!
給我分唄
RMI的開發(fā)步驟
先創(chuàng)建遠(yuǎn)程接口及聲明遠(yuǎn)程方法,注意這是實(shí)現(xiàn)雙方通訊的接口,需要繼承Remote
開發(fā)一個(gè)類來(lái)實(shí)現(xiàn)遠(yuǎn)程接口及遠(yuǎn)程方法,值得注意的是實(shí)現(xiàn)類需要繼承UnicastRemoteObject
通過(guò)javac命令編譯文件,通過(guò)java -server 命令注冊(cè)服務(wù),啟動(dòng)遠(yuǎn)程對(duì)象
最后客戶端查找遠(yuǎn)程對(duì)象,并調(diào)用遠(yuǎn)程方法
首先為服務(wù)建立一個(gè)Model層,注意因?yàn)榇藢?duì)象需要現(xiàn)實(shí)進(jìn)行遠(yuǎn)程傳輸,所以必須繼承Serializable
代碼?
package?rmi.model;
import?java.io.Serializable;
//注意對(duì)象必須繼承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)程對(duì)象調(diào)用的接口,必須繼承Remote類
publicinterface?PersonService?extends?Remote?{
public?ListPersonEntity?GetList()?throws?RemoteException;
}
建立PersonServiceImpl實(shí)現(xiàn)遠(yuǎn)程接口,注意此為遠(yuǎn)程對(duì)象實(shí)現(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)程對(duì)象的實(shí)現(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ù)器端注冊(cè)RMI通訊端口與通訊路徑,然后通訊javac命令編譯文件,通過(guò)java -server 命令注冊(cè)服務(wù)。以下面代碼為例,如果閣下將項(xiàng)目建立于D:\\RMI\RemotingService文件夾上時(shí),則先輸入D:\\RMI\RemotingService\srcjavac rmi/remotingservice/Program.java獲取Program.class(如何閣下使用的MyEclipse等開發(fā)工具,可跳過(guò)此步,直接在*/bin文件夾中直接調(diào)用已經(jīng)生成的Program.class),然后輸入D:\\RMI\RemotingService\srcjava rmi/remotingservice/Program啟動(dòng)服務(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();
//注冊(cè)通訊端口
LocateRegistry.createRegistry(6600);
//注冊(cè)通訊路徑
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();
}
}
}
最后建立客戶端進(jìn)行測(cè)試,注意客戶調(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)程對(duì)象,注意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();
}
}
}
常見錯(cuò)誤
在命令提示符調(diào)用java命令時(shí),顯示并無(wú)此命令。這是因?yàn)槲丛凇碍h(huán)境變量”中綁定JAVA的JDK命令造成的,你首先單擊“計(jì)算機(jī)右鍵”-“屬性”-“高級(jí)”-“環(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命令時(shí)出現(xiàn)“javac 找不到文件 ..... ”此錯(cuò)誤,可能是因?yàn)殚w下輸入的文件路徑出現(xiàn)錯(cuò)誤造成,注意不要把D:\\RMI\RemotingService\srcjavac rmi/remotingservice/Program.java寫錯(cuò)為D:\\RMI\RemotingService\srcjavac rmi.remotingservice.Program.java
在調(diào)用D:\\RMI\RemotingService\binjava rmi/remotingservice/Program命令時(shí)出現(xiàn)“Exception in thread 'main' java.lang.NoClassEdfoundError”錯(cuò)誤,第一這可能是閣下把Program錯(cuò)寫為Program.class,注意java命令不需要加后綴名。第二可能是閣下把“java rmi/remotingservice/Program”錯(cuò)寫為“java rmi\remotingservice\Program"。
當(dāng)前題目:javarmi實(shí)現(xiàn)代碼 java開發(fā)代碼
本文路徑:http://chinadenli.net/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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)