国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用RMI進(jìn)行遠(yuǎn)程方法調(diào)用

2019-11-17 06:14:21
字體:
供稿:網(wǎng)友

  遠(yuǎn)程方法調(diào)用(RMI)機(jī)制可以把面向?qū)ο蟮乃枷脒M(jìn)一步擴(kuò)展,因?yàn)槟憧梢哉{(diào)用的對象不僅可以在本機(jī)上,也可以在別的主機(jī)上。本文就簡單介紹rmi的編程方法。

  首先介紹一些簡單的rmi的概念。

  1, 服務(wù)器和客戶:在rmi中,假如有一個(gè)對象進(jìn)行遠(yuǎn)程方法調(diào)用,這個(gè)對象就叫做客戶機(jī)對象,而遠(yuǎn)程對象則被稱為服務(wù)器對象。

  2, 創(chuàng)建服務(wù)器對象的服務(wù)器程序:這個(gè)程序用來創(chuàng)建服務(wù)器對象,注冊這個(gè)對象,使得客戶可以通過注冊的名稱訪問服務(wù)器對象。

  3, 接口(interface),接口可以讓客戶端了解服務(wù)器所能做的工作。更具體的說,就是它列出了可以在服務(wù)器上執(zhí)行的所有方法。客戶端程序必須能夠找到這個(gè)類,否則就不能執(zhí)行對服務(wù)器函數(shù)的調(diào)用。

  4, 客戶樁(stub),有的書中翻譯成為代碼存根,它給客戶端程序提供一個(gè)樁,這個(gè)樁上"綁"著服務(wù)器對象。當(dāng)客戶程序需要調(diào)用遠(yuǎn)程對象時(shí),這個(gè)樁被下載到客戶端(假如客戶端有這個(gè)類,則不需要下載)。然后客戶就可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程的方法了。

  這個(gè)客戶樁的作用是將客戶向服務(wù)器的請求進(jìn)行編碼、進(jìn)行傳輸,服務(wù)器執(zhí)行這次調(diào)用后將結(jié)果返回到客戶樁,客戶樁進(jìn)行解碼,將解碼后的結(jié)果傳送到客戶程序中。對于編寫客戶端的程序員來說,他不需要知道其中的具體過程。

  客戶樁不需要自己編寫,后面會說明它的生成方法。它實(shí)現(xiàn)了前述的接口(interface)。

  下面就通過一個(gè)例子來說明編寫的過程。

  1, 編寫服務(wù)器的接口:這一步是最主要的部分,因?yàn)榻涌谑沁B接客戶機(jī)與服務(wù)器的要害部分。在這個(gè)例子中,接口很簡單,代碼如下:

import java.rmi.*;
public interface PRodUCt extends Remote
{
 String getDescription() throws RemoteException;
}
在這里應(yīng)注重的是,遠(yuǎn)程對象的接口一定要擴(kuò)展(extend)Java.rmi包的Remote接口。同時(shí)接口中的所有的方法都要聲明拋出RemoteException異常。這是因?yàn)橛捎诰W(wǎng)絡(luò)連接的不可靠性,遠(yuǎn)程方法調(diào)用很可能失敗。假如不聲明異常,在遠(yuǎn)程方法調(diào)用失敗后,應(yīng)用程序就會無法結(jié)束。進(jìn)入討論組討論。

  2, 編寫服務(wù)器對象:

  Java中具有一個(gè)可以直接使用的服務(wù)器類--UniCastRemoteObject。它存在于Java.rmi.server包中。我們可以直接擴(kuò)展這個(gè)類,使它實(shí)現(xiàn)前述的接口。這樣就可以使服務(wù)器滿足我們的需要。

import java.rmi.server.*;
import java.rmi.*;
public class ProductImpl extends UnicastRemoteObject implements Product
{
 public ProductImpl(String name) throws RemoteException
 {
  Desc = name;
 }
 public String getDescription() throws RemoteException
 {
  return "This is "+Desc+" product";
 }
 private String Desc;
}
  可以看到,rmi服務(wù)器的實(shí)現(xiàn)和其他的方法代碼沒有什么不同。

  3, 編寫創(chuàng)建服務(wù)器對象的服務(wù)器程序:

import java.rmi.*;
public class ProductServer
{
 public static void main(String[] args)
 {
  try
  {
   System.out.println("Constructin Server implementations ....");
   ProductImpl p1 = new ProductImpl("toaster");
   ProductImpl p2 = new ProductImpl("microwave");
   System.out.println("Binding server implementations to registry");
   Naming.rebind("toaster",p1);
   Naming.rebind("microwave",p2);
   System.out.println("waiting for clients...");
  }catch(Exception e)
  {
   System.out.println("Error "+e);
  }
 }
}
通過代碼可以看到,這個(gè)服務(wù)器首先創(chuàng)建了兩個(gè)服務(wù)器對象。然后使用Naming.rebind()方法,將這個(gè)對象和一個(gè)名稱聯(lián)系(綁定)在一起。這個(gè)名稱就是客戶機(jī)查找服務(wù)器對象所使用的名稱。Naming是java.rmi包中的類。這個(gè)類的作用是建立一套查找對象的命名機(jī)制。通過它就可以將綁定在特定名稱上的對象找到。進(jìn)入討論組討論。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 深泽县| 宁德市| 江油市| 呼伦贝尔市| 秀山| 紫金县| 嘉定区| 元朗区| 德兴市| 扶绥县| 九龙县| 伊宁县| 资阳市| 阳江市| 藁城市| 拉孜县| 广安市| 封丘县| 教育| 银川市| 新邵县| 柯坪县| 东辽县| 苍溪县| 江口县| 中西区| 高阳县| 阳原县| 黄大仙区| 包头市| 乃东县| 唐河县| 乾安县| 仁布县| 河津市| 饶平县| 宁乡县| 安康市| 伊宁县| 阳朔县| 姜堰市|