在上篇blog中談到RMI的問世由來只是大致的把一些概念結(jié)構(gòu)說明了下,自己靜靜想想要有好的說明干脆用代碼說明比較妥當也最為有說明性。事后自己倒騰了一個簡單的代碼DEMO。代碼中有個簡單的場景,比如你是屬于某地區(qū)醫(yī)保范圍內(nèi)的成員,到醫(yī)院看病,這個候醫(yī)院為了審核你的相關(guān)個人資料需要到醫(yī)保管理部門調(diào)閱信息,你只需要給出用戶名稱或者其他一個有效參數(shù)交給工作人員通過網(wǎng)絡(luò)到遠程醫(yī)保部門調(diào)閱信息即可。
廢話不多說,代碼最能說明問題了。首先出場的客戶端的代碼。
客戶端
代理接口:
/**
*IUserInfo:代理接口
*
*@author:wgh
*/
public interface IUserInfo {
public UserInfoOut getValidate(UserInfoIn in) throws IOException, ClassNotFoundException;
}
后臺樁基類(實現(xiàn)了代理接口):
/**
*UserInfoStub:后臺樁基(stub)類,把接口中的參數(shù)通過套接字請求方式發(fā)送到服務(wù)端(接收返回對象或者參數(shù))
*
*@author:wgh
*/
public class UserInfoStub implements IUserInfo {
Socket socket = null;
public UserInfoStub() throws IOException {
socket = new Socket("localhost", 8999);
}
public UserInfoOut getValidate(UserInfoIn in) throws IOException,ClassNotFoundException {
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.writeObject(in);
os.flush();
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
UserInfoOut userInfo = (UserInfoOut) is.readObject();
return userInfo;
}
}
到這里客戶端就基本結(jié)束了,呵呵。是不是很容易?接下來我們要看看服務(wù)端如何運作的:
服務(wù)端
實現(xiàn)類:
/**
*UserInfoImpl:實現(xiàn)類
*
*@author:wgh
*/
public class UserInfoImpl implements IUserInfo {
public UserInfoOut getValidate(UserInfoIn userInfoIn) {
if(userInfoIn.getParameter().equals("yeshucheng")){
UserInfoOut userInfoOut=new UserInfoOut();
userInfoOut.setId(userInfoIn.getId());
userInfoOut.setName("萬國輝");
userInfoOut.setAge("30");
userInfoOut.setDescn("描述");
return userInfoOut;
}
return null;
}
}
后臺骨架類:
/**
*UserInfoSkeleton:后臺服務(wù)端(skeleton)類,通過ServerSocket處理請求參數(shù)根據(jù)需求返回對象值
*
*@author:wgh
*/
public class UserInfoSkeleton extends Thread{
public UserInfoImpl userInfoImpl;
Socket socket=null;
public UserInfoSkeleton(UserInfoImpl userInfoImpl){
this.userInfoImpl=userInfoImpl;
}
public void run(){
try {
ServerSocket server=new ServerSocket(8999);
System.out.println("Server Waiting...");
socket=server.accept();
ObjectInputStream oi=new ObjectInputStream(socket.getInputStream());
UserInfoIn userInfoIn=(UserInfoIn) oi.readObject();
UserInfoOut userInfoOut=userInfoImpl.getValidate(userInfoIn);
if(userInfoIn.getParameter().equals("yeshucheng")){
ObjectOutputStream os=new ObjectOutputStream(socket.getOutputStream());
os.writeObject(userInfoOut);
os.flush();
}
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try{
if(socket!=null)
socket.close();
}catch(Exception e){
System.out.println(" socket is Exception not closed cause is:"+e.toString());
}
}
}
}
到這里服務(wù)端的代碼也結(jié)束了。那我們還缺少什么呢?沒錯,就是傳輸?shù)膶ο蟆T谶@里我們采用ValueObject的方式通過兩個對象來說明,一個是請求對象,一個是返回相應(yīng)對象。
值對象:
/**
*UserInfoIn:發(fā)送對象
*
*@author:wgh
*/
public class UserInfoIn implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String parameter;
public String getId() {
returnid;
}
public void setId(String id) {
this.id = id;
}
public String getParameter() {
returnparameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
}
/**
*UserInfoOut:返回對象
*
*@author:wgh
*/
public class UserInfoOut implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String descn;
private String age;
public String getId() {
returnid;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
returnname;
}
public void setName(String name) {
this.name = name;
}
public String getDescn() {
returndescn;
}
public void setDescn(String descn) {
this.descn = descn;
}
public String getAge() {
returnage;
}
public void setAge(String age) {
this.age = age;
}
}
好了到這里算是結(jié)束了。至于為什么有這個思路,要結(jié)合前面的RMI的問世由來提到的相結(jié)合就好理解了。最后就是讓我們來構(gòu)造一個運行主函數(shù)類了:
/**
* TestMain:啟動
*
*@author:wgh
*/
public class TestMain {
/**
*@paramargs
*@throwsIOException
*@throwsClassNotFoundException
*@throwsInterruptedException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//start server
UserInfoImpl impl=new UserInfoImpl();
UserInfoSkeleton skel=new UserInfoSkeleton(impl);
skel.start();
Thread.sleep(6000);
//start client
IUserInfo stub = new UserInfoStub();
UserInfoIn userInfoIn=new UserInfoIn();
userInfoIn.setId("1");
userInfoIn.setParameter("yeshucheng");
UserInfoOut userInfoOut=stub.getValidate(userInfoIn);
System.out.println("return vo's id is :" + userInfoOut.getId());
System.out.println("return vo's name is :" + userInfoOut.getName());
System.out.println("return vo's age is :" + userInfoOut.getAge());
System.out.println("return vo's descn is :" + userInfoOut.getDescn());
}
}
注:這里的代碼稍顯寫的有點亂不夠章法,我就這么寫這大家就先這么看著。不過代碼已經(jīng)運行成功過了。這里的代碼其實還可以優(yōu)化的更OO
posted on 2009-02-03 21:56
葉澍成 閱讀(1786)
評論(3) 編輯 收藏 所屬分類:
java基礎(chǔ) 、
分布式