使用java和CORBA實現分佈應用程式設計
因為課程的需要,學習了下用java和CORBA來實現分佈應用程式設計,具體的CORBA是什麼以及它的框架結構我就不多說了,這裡我是給出一個比較完整的例子來展示下程式碼要怎麼寫。
應用背景:
使用java和CORBA構建一個關於制訂to-do-list的分散式應用。不同的客戶端可以通過連線到伺服器來管理自己的to-do-list,比如有add list items、query list items、delete list items、clear to-do lists、show total list等功能。同時伺服器可以管理使用者,比如有登入和註冊功能。每個to-do list的內容有該做的事、開始時間、結束時間。
具體實現
一、編寫IDL介面定義檔案
使用IDL語言為遠端物件定義介面,根據題目要求,定義IDL檔案如下:
(1)在檔案creator.idl中:
module CreatorModule{
interface Creator{
boolean login(in string name,in string password);
boolean register(in string name,in string password);
};
};
這是用來管理使用者的,提供了註冊和登陸介面。
(2)在檔案user.idl中:
mmodule UserModule{
interface User{
boolean add(in string startTime,in string endTime,in string label);
string query(in string startTime,in string endTime);
boolean delete(in string key);
boolean clear();
string show();
};
};
add()、query()、delete()、clear()、show()分別為客戶端對to-do-list中的item進行增查刪清的操作。
二、將介面定義檔案編譯為相應高階語言原始碼,產生伺服器框架與客戶端存根
定義好IDL介面檔案後,使用idlj編譯器生成Java語言的stub和skeleton原始檔。idlj編譯器預設只生成客戶端的binding程式碼。如果同時需要客戶端的bindings和伺服器端的skeletons,必須加上-fall選項。
所以在shell中先後輸入命令
idlj -fall /home/huxijie/IntelliJIDEAProjects/ToDoListApp/src/creator.idl
和命令
idlj -fall /home/huxijie/IntelliJIDEAProjects/ToDoListApp/src/user.idl
後會生成目錄CreatorModule和UserModule。兩個目錄的檔案如下:
對CreatorModule目錄下的六個檔案說明如下:
(1) Creator.java:此介面包含IDL介面的Java版本。它繼承自org.omg.CORBA.Object,提供標準的CORBA物件功能。
(2)CreatorHelper.java : 此類提供輔助功能,Helper類負責讀寫資料型別到CORBA流,以及插入和提取資料型別。
(3)CreatorHolder.java : 此類是一個終態類,其中含有Creator型別的公有資料成員。
(4)CreatorOperations.java : 這是一個介面類,其中含有在creator.idl檔案中編寫的介面方法。
(5)CreatorPOA.java : 此抽象類是基於流的伺服器Skeleton,為伺服器提供基本的CORBA功能。它繼承org.omg.PortableServer.Servant, 實現了InvokeHandler介面和CreatorOperations介面。以後編寫的伺服器類要繼承CreatorPOA。
(6)_CreatorStub.java : 此類是客戶端stub,為客戶端提供CORBA功能。它繼承org.omg.CORBA.Object,提供標準CORBA物件功能。還擴充套件了 CreatorOperations介面和org.omg.CORBA.portable.IDLEntity介面。
UserModule目錄下的檔案意義和上面類似。
三、編寫物件類
根據題意,需要編寫Person類來抽象化使用者以及Item類來抽象化to-do-list中的事項。因為我是將使用者列表和事項列表存在本地檔案中,所以需要讓Person類和Item類實現Serializable序列化。
/**
* Created by huxijie on 17-5-3.
* 使用者類
*/
public class Person implements Serializable{
private String name;
private String password;
public Person(String name, String password) {
this.name = name;
this.password = password;
}
public String getPassword() {
return password;
}
}
/**
* Created by huxijie on 17-5-3.
* 事項類
*/
public class Item implements Serializable{
private Date startTime;
private Date endTime;
private String label;
public Item(Date startTime, Date endTime, String label) {
this.startTime = startTime;
this.endTime = endTime;
this.label = label;
}
public Date getStartTime() {
return startTime;
}
public Date getEndTime() {
return endTime;
}
public String getLabel() {
return label;
}
}
四、介面實現
(一)實現creator.idl中定義的介面
/**
* Created by huxijie on 17-5-3.
* 實現使用者管理creator.idl中定義的介面
*/
public class CreatorImpl extends CreatorPOA {
private Map<String, Person> personsMap;
private String name = null;
private ORB orb;
private ToDoListServer toDoListServer;
private UserImpl userImpl;
public CreatorImpl() {
init();
}
//初始化
private void init() {
//從檔案中讀取使用者列表,轉化為HashMap
try {
FileInputStream fin = new FileInputStream("person.file");
ObjectInputStream oin = new ObjectInputStream(fin);
try {
Object object = oin.readObject();
personsMap = (HashMap<String, Person>) object;
} catch (ClassNotFoundException e) {
System.out.println("object cast error");
personsMap = new HashMap<String, Person>();
}
oin.close();
fin.close();
} catch (Exception e) {
personsMap = new HashMap<String, Person>();
}
}
//將使用者表儲存到本地檔案中
private void saveData() {
try {
FileOutputStream fout = new FileOutputStream("person.file");
ObjectOutputStream oout = new ObjectOutputStream(fout);
oout.writeObject(personsMap);
oout.flush();
fout.flush();
oout.close();
fout.close();
} catch (Exception e) {
System.out.println("save error.");
e.printStackTrace();
}
}
public void setORB(ORB orb) {
this.orb = orb;
}
public void setToDoListServer(ToDoListServer toDoListServer) {
this.toDoListServer = toDoListServer;
}
//對使用者名稱進行註冊服務
private void registerService(String name) {
toDoListServer.registerUserName(name);
}
@Override
public boolean login(String name, String password) {
Person p = personsMap.get(name);
if (p != null && p.getPassword().equals(password)) {
this.name = name;
//登入成功後對使用者名稱進行註冊服務
registerService(name);
return true;
} else {
return false;
}
}
@Override
public boolean register(String name, String password) {
Person person = personsMap.get(name);
if (person != null) { //表中使用者名稱為name的已存在
return false;
} else {
personsMap.put(name, new Person(name, password));
saveData();
return true;
}
}
}
(二)實現user.idl中定義的介面
/**
* Created by huxijie on 17-5-3.
* 實現to-do-list管理user.idl中定義的介面
*/
public class UserImpl extends UserPOA{
private Date date;
private DateFormat dateFormat;
private String dateRegex;
private List<Item> personalList; //單個使用者的to-do-list
private Map<String, List<Item>> allPersonListMap; //所有使用者的to-do-list
private ORB orb;
public UserImpl(String name) {
init();
personalList = allPersonListMap.get(name);
if (personalList == null) {
personalList = new ArrayList<Item>();
allPersonListMap.put(name, personalList);
}
date = new Date();
dateFormat = DateFormat.getDateInstance();
//日期格式規定為:xxxx-xx-xx,xx:xx
dateRegex = "\\d{4}-\\d{1,2}-\\d{1,2},\\d{2}:\\d{2}";
}
private void init() {
//從檔案中讀取to-do-list列表,轉化為HashMap
try {
FileInputStream fin = new FileInputStream("item.file");
ObjectInputStream oin = new ObjectInputStream(fin);
try {
Object object = oin.readObject();
allPersonListMap = (HashMap<String, List<Item>>) object;
} catch (ClassNotFoundException e) {
System.out.println("object cast error");
allPersonListMap = new HashMap<String, List<Item>>();
}
oin.close();
fin.close();
} catch (Exception e) {
allPersonListMap = new HashMap<String, List<Item>>();
}
}
public void setORB(ORB orb) {
this.orb = orb;
}
//將to-do-list表儲存到本地檔案中
private void saveData() {
try {
FileOutputStream fout = new FileOutputStream("item.file");
ObjectOutputStream oout = new ObjectOutputStream(fout);
oout.writeObject(allPersonListMap);
oout.flush();
fout.flush();
oout.close();
fout.close();
} catch (Exception e) {
System.out.println("save error.");
e.printStackTrace();
}
}
//判斷輸入日期是否符合格式要求
private boolean isFormatMatch(String dateStr) {
return dateStr.matches(dateRegex);
}
//將字串轉化為日期
private Date turnToDate(String dateStr) {
String[] str = dateStr.split("[,|:]");
try {
date = dateFormat.parse(str[0]);
date.setHours(Integer.parseInt(str[1]));
date.setMinutes(Integer.parseInt(str[2]));
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
@Override
public boolean add(String startTime, String endTime, String label) {
Date startDate,endDate;
if (isFormatMatch(startTime) && isFormatMatch(endTime)) {
startDate = turnToDate(startTime);
endDate = turnToDate(endTime);
Item item = new Item(startDate, endDate, label);
personalList.add(item);
saveData();
return true;
} else {
return false;
}
}
@Override
public String query(String startTime, String endTime) {
Date startDate,endDate;
int index = 0;
String queryResult = "";
if (isFormatMatch(startTime) && isFormatMatch(endTime)) {
startDate = turnToDate(startTime);
endDate = turnToDate(endTime);
for (Item item : personalList) {
if (item.getStartTime().after(startDate)
&& item.getEndTime().before(endDate)) {
index++;
queryResult += index + " : " + item.getStartTime() +
"-->" + item.getEndTime() +
" " + item.getLabel() + "\n";
}
}
} else {
queryResult = "Date format is wrong!\n";
}
return queryResult;
}
@Override
public String show() {
String result = "";
int index = 0;
if (personalList.size() > 0) {
for (Item item : personalList) {
index++;
result += index + " : " + item.getStartTime() +
"-->" + item.getEndTime() +
" " + item.getLabel() + "\n";
}
} else {
result = "Empty to-do-list!\n";
}
return result;
}
@Override
public boolean delete(String key) {
int index = Integer.parseInt(key);
if (index <= personalList.size() && index >= 1) {
personalList.remove(index - 1);
saveData();
return true;
} else {
return false;
}
}
@Override
public boolean clear() {
int index = personalList.size()-1;
if (index < 0) {
return false;
} else {
while (index >= 0) {
personalList.remove(index);
index--;
}
saveData();
return true;
}
}
}
五、基於伺服器框架,編寫服務物件實現程式
/**
* Created by huxijie on 17-5-3.
* 基於伺服器框架,編寫伺服器物件
*/
public class ToDoListServer {
private ORB orb;
private POA rootPOA;
private org.omg.CORBA.Object obj;
private CreatorImpl creatorImpl;
private UserImpl userImpl;
private org.omg.CORBA.Object ref;
private Creator creatorhref;
private User userhref;
private org.omg.CORBA.Object objRef;
private NamingContextExt ncRef;
public static void main(String[] args) {
ToDoListServer toDoListServer = new ToDoListServer();
toDoListServer.init();
}
//初始化,註冊Creator到服務中
private void init() {
try {
String[] args = {};
Properties properties = new Properties();
properties.put("org.omg.CORBA.ORBInitialHost", "127.0.0.1"); //指定ORB的ip地址
properties.put("org.omg.CORBA.ORBInitialPort", "8080"); //指定ORB的埠
//建立一個ORB例項
orb = ORB.init(args, properties);
//拿到根POA的引用,並激活POAManager,相當於啟動了server
obj = orb.resolve_initial_references("RootPOA");
rootPOA = POAHelper.narrow(obj);
rootPOA.the_POAManager().activate();
//建立一個CreatorImpl例項
creatorImpl = new CreatorImpl();
creatorImpl.setToDoListServer(this);
//從服務中得到物件的引用,並註冊到服務中
ref = rootPOA.servant_to_reference(creatorImpl);
creatorhref = CreatorHelper.narrow(ref);
//得到一個根命名的上下文
objRef = orb.resolve_initial_references("NameService");
ncRef = NamingContextExtHelper.narrow(objRef);
//在命名上下文中繫結這個物件
String name = "Creator";
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind(path, creatorhref);
System.out.println("server.ToDoListServer is ready and waiting....");
//啟動執行緒服務,等待客戶端呼叫
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}
//對使用者名稱進行註冊服務
public void registerUserName(String name) {
try {
//建立一個UserImpl例項
userImpl = new UserImpl(name);
userImpl.setORB(orb);
//從服務中得到物件的引用,並註冊到服務中
ref = rootPOA.servant_to_reference(userImpl);
userhref = UserHelper.narrow(ref);
//在命名上下文中繫結這個物件
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind(path, userhref);
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、基於客戶端存根,編寫客戶物件呼叫程式
/**
* Created by huxijie on 17-5-3.
* 基於客戶端存根,編寫客戶物件呼叫程式
*/
public class ToDoListClient {
private Creator creator;
private User user;
private BufferedReader reader;
private ORB orb;
private org.omg.CORBA.Object objRef;
private NamingContextExt ncRef;
public ToDoListClient() {
reader = new BufferedReader(new InputStreamReader(System.in));
}
public static void main(String[] args) {
ToDoListClient toDoListClient = new ToDoListClient();
toDoListClient.init();
toDoListClient.procedure();
}
private void init() {
System.out.println("Client init config starts....");
String[] args = {};
Properties properties = new Properties();
properties.put("org.omg.CORBA.ORBInitialHost", "127.0.0.1"); //指定ORB的ip地址
properties.put("org.omg.CORBA.ORBInitialPort", "8080"); //指定ORB的埠
//建立一個ORB例項
orb = ORB.init(args, properties);
//獲取根名稱上下文
try {
objRef = orb.resolve_initial_references("NameService");
} catch (InvalidName e) {
e.printStackTrace();
}
ncRef = NamingContextExtHelper.narrow(objRef);
String name = "Creator";
try {
//通過ORB拿到server例項化好的Creator類
creator = CreatorHelper.narrow(ncRef.resolve_str(name));
} catch (NotFound e) {
e.printStackTrace();
} catch (CannotProceed e) {
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
e.printStackTrace();
}
System.out.println("Client init config ends...");
}
//與使用者互動
public void procedure() {
String choice;
String startTime, endTime, label;
String index;
try {
while (true) {
System.out.println("Welcome to to_do_list_APP!Please choose:");
System.out.println("1.Register\n2.Login\n3.Exit");
choice = reader.readLine();
switch (choice) {
case "1":
while (true) {
if (register()) {
break;
}
}
break;
case "2":
while (true) {
if (login()) {
System.out.println("Login Successful!");
do {
System.out.println("Please choose following command:");
System.out.println("1.Add item\n" +
"2.Query item\n" +
"3.Show items\n" +
"4.Delete item\n" +
"5.Clear items\n" +
"6.Logout");
choice = reader.readLine();
switch (choice) {
case "1":
System.out.println("please input startTime (like this:2017-04-19,08:20):");
startTime = reader.readLine();
System.out.println("please input endTime (like this:2017-04-19,08:20):");
endTime = reader.readLine();
System.out.println("please input label:");
label = reader.readLine();
if (user.add(startTime, endTime, label)) {
System.out.println("Add item successful!");
} else {
System.out.println("Add item fail!");
}
break;
case "2":
System.out.println("please input startTime (like this:2017-04-19,08:20):");
startTime = reader.readLine();
System.out.println("please input endTime (like this:2017-04-19,08:20):");
endTime = reader.readLine();
System.out.println(user.query(startTime, endTime));
break;
case "3":
System.out.println(user.show());
break;
case "4":
System.out.println("please input index:");
index = reader.readLine();
if (user.delete(index)) {
System.out.println("Delete item successful!");
} else {
System.out.println("Delete item fail!");
}
break;
case "5":
if (user.clear()) {
System.out.println("Clear items done!");
}
break;
}
} while (!choice.equals("6"));
break;
} else {
System.out.println("Login fail!");
break;
}
}
break;
case "3":
return;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//註冊
private boolean register() {
String username, password;
try {
System.out.println("please input username:");
username = reader.readLine();
System.out.println("please input password:");
password = reader.readLine();
if (creator.register(username, password)) {
System.out.println("Register successful!");
return true;
} else {
System.out.println("Register fail!");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//登入
private boolean login() {
String username, password;
try {
System.out.println("please input username:");
username = reader.readLine();
System.out.println("please input password:");
password = reader.readLine();
if (creator.login(username, password)) {
try {
//通過ORB拿到server例項化好的User類
user = UserHelper.narrow(ncRef.resolve_str(username));
} catch (NotFound e) {
e.printStackTrace();
} catch (CannotProceed e) {
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
e.printStackTrace();
}
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
七、啟動orbd服務
在shell裡輸入命令(注意orbd命令是在%JAVA_HOME%/bin下):
orbd -ORBInitialPort 8080 -ORBInitialHost 127.0.0.1
八、啟動server
九、啟動client
執行結果
一、伺服器端
二、客戶端
(一)註冊
(二)登入
(三)Add
(四)Show
(五)Query
(六)Delete
(七)Clear
相關推薦
使用java和CORBA實現分佈應用程式設計
因為課程的需要,學習了下用java和CORBA來實現分佈應用程式設計,具體的CORBA是什麼以及它的框架結構我就不多說了,這裡我是給出一個比較完整的例子來展示下程式碼要怎麼寫。 應用背景: 使用java和CORBA構建一個關於制訂to-do-list的分
使用Java/CORBA實現分佈應用程式設計
一、學習JAVA與CORBA■CORBA技術簡介 簡單地說,CORBA允許應用之間相互通訊,而不管它們存在於哪裡以及是誰設計的。CORBA1.1於1991年由OMG釋出,其中定義了介面定義語言(IDL)以及在物件請求代理(ORB)中實現客戶物件與伺服器物件之間互動的應用程
java和python實現一個加權SlopeOne推薦算法
劉德華 .com java實現 偏差 推薦算法 blog src double ash 一.加權SlopeOne算法公式: (1).求得所有item之間的評分偏差 上式中分子部分為項目j與項目i的偏差和,分母部分為所有同時對項目j與項目i評分的用戶數 (2).加權預測評分
編程之美—象棋將帥問題java和C++實現
象棋解決思路這樣如下圖:然後我的java實現public class xiangqi { public static void main(String[] args) { byte s=81; while(s!=0){ if((s/9%3)==(
用JAVA和Jquery實現掃碼登入的原理和程式碼
貼上前端程式碼,供參考 <script type="text/javascript" src="js/jquery-3.3.1.js"></script> <script type="text/javascript" src="js/jq
Spark中RDD轉換成DataFrame的兩種方式(分別用Java和scala實現)
一:準備資料來源 在專案下新建一個student.txt檔案,裡面的內容為: print? <code class="language-java">1,zhangsan,20 2,lisi,21 3,wanger,1
第67課:Spark SQL下采用Java和Scala實現Join的案例綜合實戰(鞏固前面學習的Spark SQL知識)
內容: 1.SparkSQL案例分析 2.SparkSQL下采用Java和Scala實現案例 一、SparkSQL下采用Java和Scala實現案例 學生成績: {"name":"Michael","score":98} {"name":"Andy"
JDBC專案實戰,使用Java和MySQL實現銀行ATM系統
JDBC 資料庫階段性專案:ATM系統 需求分析 一、ATM機 1、要求使用插卡(這裡使用卡號)和密碼登入ATM系統; 2、能夠根據使用者賬戶的凍結狀態判斷使用者是否能夠進入系統並給出提示; 3、使用者進入系統後可以檢視其賬戶所有資訊; 4、使用者可以存取款與轉
Basic Auth請求的java和python實現方案
java 使用apache的包,當時找了挺久輪子,最後在外網看到. Basic Auth with Raw HTTP Headers Preemptive Basic Authentication basically means pre-sending the Authorization header.
99乘法表分別用java和python實現
如何用java和python實現九九乘法表 java python python一行實現 java class ChengFaBiao { public static void main(String[] args) { for
DNS域名服務協議和其實現Bind應用
1、DNS概述 DNS(Domain Name Service,域名服務)是一種應用層協議,客戶端和DNS伺服器是C/S架構模式,監聽在TCP的53號埠和UDP的53號埠上。tld(Top Level Domain)頂層域分為組織域(.com, .net, .org, .gov, .
java和js實現aes加密解密
由於公司安全測試,要對重要資訊進行加密傳輸,使得java、android、ios一致。 java程式碼 package gov.communitycloud.user.utils; import java.math.BigInteger; import javax.cr
【開發筆記】Java和.Net實現JS中的escape()和unescape()
在做建行支付對接時,傳的引數中的漢字,需要用escape()編碼 但我是通過Java和.Net後臺直接請求,因此需要在後臺實現類似的功能 所以在此貼上程式碼 Java /** * 漢字編碼,實現js escape() * * @p
層次聚類 java和matlab實現
層次聚類演算法與之前所講的順序聚類有很大不同,它不再產生單一聚類,而是產生一個聚類層次。說白了就是一棵層次樹。介紹層次聚類之前,要先介紹一個概念——巢狀聚類。講的簡單點,聚類的巢狀與程式的巢狀一樣,一個聚類中R1包含了另一個R2,那這就是R2巢狀在R1中,或者說是R1嵌套
使用java 和freemarker實現多級選單(分類)
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @RequestMapping("/test/type") @Controller public class Test
用Java和Jquery實現了一個砸金蛋例子
之前在網上找到了一個Jquery+PHP實現的砸金蛋的例子,正好公司也要我寫一個類似的砸金蛋的功能,於是在網上找了找參考,用Jsp程式也弄了一個出來,首先是Html的效果,我打算每次在頁面上只顯示一個金蛋,點選的時候用Ajax提交,Java在後臺處理一下返回結果
新詞發現及Java和spark實現
新詞發現並不是一個新的課題,但最有意思的一點是如果採用無監督的演算法,可以完全脫離人工的經驗由演算法自動找到有語意的“詞語”,而不是胡亂拼湊的漢字片段(歸因於演算法的有效性和語料本身是由有意義的詞語構成的)。本文參考了matrix67的一篇文章,網際網路時代的社
遞迴刪除樹形結構的所有子節點(java和mysql實現)
1.業務場景 有如下樹形結構: +—0 +—1 +—2 +—4 +—5 +—3 如果刪除某個父節點,則其
Java併發程式設計(6):Runnable和Thread實現多執行緒的區別(含程式碼)
Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行
Java併發程式設計的藝術——volatile和synchronized實現原理
volatile volatile變數修飾的共享變數進行寫操作時候,會多出lock字首指令。 lock字首指令在多核處理器下會引發一下兩件事情: 將當前處理器快取行的資料寫回到系統記憶體。 這個寫回記