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

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

Applet與Servlet通訊的四種方法及其比較

2019-11-18 11:57:47
字體:
供稿:網(wǎng)友

   Applet與Servlet之間的聯(lián)系一般是間接的,即頁面請求由瀏覽器發(fā)送給Servlet,
  作為回答,Servlet將結(jié)果生成Html文檔發(fā)送給瀏覽器。很多時候在Servlet與Applet之
  間建立直接的聯(lián)系是沒有必要的,但假如要顯示一些實時的動態(tài)數(shù)據(jù),如聊天室窗口、
  新聞顯示、股市行情等,建立兩者之間的直接聯(lián)系就很有用了。非凡地,在較為復(fù)雜的
  分布式java應(yīng)用中,這種通訊更是必不可少。在客戶端Java程序與服務(wù)器端Java程序之
  間建立這種復(fù)雜的交互方式僅僅使用Servlet與Applet API是不夠的,本文為你介紹和比
  較四種通訊方式:通過HTML頁面?zhèn)鬟f參數(shù),用java.net包的網(wǎng)絡(luò)功能建立直接網(wǎng)絡(luò)連接
  ,遠(yuǎn)程方法調(diào)用(RMI)與CORBA。
   一、通過HTML頁面?zhèn)鬟fApplet參數(shù)
   通過HTML頁面?zhèn)鬟f參數(shù)是在Servlet與Applet之間建立聯(lián)系最為常用的方法。Serv
  let只要把傳遞給Applet的參數(shù)寫入HTML頁面就可以了。這種通訊是單向的,用于實現(xiàn)S
  ervlet對Applet的控制。其實現(xiàn)方法類如:
  // doGet()方法生成一個包含Applet的HTML頁面,
  // 該Applet需要一個Data參數(shù)
  Applet與Servlet通訊的四種方法及其比較
   這種方法很簡單,但它有兩個缺點。首先,所有參數(shù)都是靜態(tài)的,即一旦HTML頁面
  發(fā)送完成,要更新其中部分?jǐn)?shù)據(jù)就很困難了。雖然可以使用HTTP的刷新機(jī)制,但這種刷
  新需要重新下載整個頁面,效率是很低的。第二,假如需要傳遞給Applet的數(shù)據(jù)量很大
  或數(shù)據(jù)結(jié)構(gòu)很復(fù)雜,就會使得HTML頁面過于龐大或復(fù)雜了。
   二、用java.net包建立雙向通訊
   第二種方法是利用java.net包提供的網(wǎng)絡(luò)能力。以有連接流通訊方式為例,在服務(wù)
  器端的操作為一般為:
   ⑴ 創(chuàng)建一個ServerSocket對象,在指定端口監(jiān)聽客戶端發(fā)來的請求。
   ⑵ 在接收到請求時accept()方法將返回一個Socket對象。
   ⑶ 用上述Socket對象創(chuàng)建輸入、輸出流對象。
   ⑷ 通過輸入、輸出流與客戶交互。
   ⑸ 交互完畢,關(guān)閉輸入、輸出流與Socket。
   ⑹ 服務(wù)程序運行結(jié)束,關(guān)閉ServerSocket。
   實現(xiàn)代碼代碼類如:
  try{
  boolean flag=true;
  Socket clientSocket=null;
  ServerSocket serverSocket = new ServerSocket(0);
  System.out.  while(flag){
  clientSocket=serverSocket.accept();
  DataInputStream is=new DataInputStream( new bufferedInputStream(clientSocket
  .getInputStream()));
  PrintStream os=new PrintStream( new bufferedOutputStream(clientSocket.getOut
  putStream()));
  // 處理Applet請求
  os.close();
  is.close();
  clientSocket.close();
  }
  serverSocket.close();
  }catch( IOException e){
  System.err.println(" Exception: "+e);
  }
   在客戶端的操作為:
   ⑴ 創(chuàng)建Socket對象建立與服務(wù)器的連接。
   ⑵ 用該Socket對象創(chuàng)建輸入、輸出流。
   ⑶ 與服務(wù)器交互。
   ⑷ 交互完畢,關(guān)閉輸入、輸出流與Socket。
   實現(xiàn)代碼類如:
  try {
  Socket clientSocket =new Socket("serverName",7);
  OutputStream os=clientSocket.getOutputStream();
  DataInputStream is=new DataInputStream( clientSocket.getInputStream());
  // 其它操作.
  os.close();
  is.close();
  clientSocket.close();
  }catch(Exception e){
  System.err.println("Exception:"+e);
  }
   這種方法只依靠于標(biāo)準(zhǔn)的Java網(wǎng)絡(luò)支持,不需要用到附加的軟件包或工具, 因此
  顯得相當(dāng)簡潔和靈活,易于實現(xiàn)某些非凡的需要。但在另一方面,服務(wù)器端對進(jìn)入請求
  以及客戶端對返回結(jié)果的分析工作量較大。假如服務(wù)器端要執(zhí)行大量的操作,可以考慮
  使用RMI。
   三、遠(yuǎn)程方法調(diào)用RMI
   Java的RMI技術(shù)顯著地改善了客戶程序操作復(fù)雜的服務(wù)器端對象的能力。對Applet
  來說,服務(wù)器端對象所提供的遠(yuǎn)程方法可以象普通的客戶端句柄一樣調(diào)用。使用RMI時應(yīng)
  先定義遠(yuǎn)程接口,即一個繼續(xù)自java.rmi.Remote的公用接口。在該接口中定義要求在服
  務(wù)器上運行的方法,所有這些方法的throws子句至少應(yīng)該聲明java.rmi.RemoteExcepti
  on異常。
   接下來是實現(xiàn)遠(yuǎn)程接口,遠(yuǎn)程接口的實現(xiàn)類應(yīng)該:
   ⑴ 指定所實現(xiàn)的一個或多個接口。
   ⑵ 定義遠(yuǎn)程對象的構(gòu)造方法。
   ⑶ 提供所有可供遠(yuǎn)程調(diào)用的方法的實現(xiàn)。
   ⑷ 創(chuàng)建和安裝安全治理器。
   ⑸ 創(chuàng)建一個或多個遠(yuǎn)程對象實例。
   ⑹ 注冊至少一個遠(yuǎn)程對象。
   下面的代碼實現(xiàn)一個返回日期字符串的getData()遠(yuǎn)程方法,該方法由接口RMISer
  v2App定義:
  // 本類繼續(xù)自UnicastRemoteObject,實現(xiàn)接口serv2app
  package com.servletsolutions.serv2app.rmi;
  import java.rmi.*;
  import java.rmi.server.*;
  public class RMIImplementation extends UnicastRemoteObject
  implements RMIServ2App{
  public RMIImplementation() throws RemoteException{}
  public String getData() throws RemoteException{
  return java.text.DateFormat.getDateInstance().format(
  new java.util.Date());
  }
  public static void main(String[] args){
  // 安全治理器
  System.setSecurityManager(new RMISecurityManager());
  try{
  // 遠(yuǎn)程對象實例
  RMIImplementation bootStrap = new RMIImplementation();
  // 注冊
  Naming.bind(args[0], bootStrap);
  System.out.println(args[0] + " 注冊成功");
  }catch(Exception e){
  System.err.println("注冊失敗.");
  System.err.println(e);
  }
  }
  }
   在客戶端,Applet對接口RMIServ2App的引用通過調(diào)用Naming.lookup(String)獲得
  ,如下所示:
   RMIServ2App obj = (RMIServ2App)Naming.lookup("http://" + getCodeBase().getHo
  st() + "/ServerName");
   除了編譯Java代碼之外,還要用rmic編譯器生成遠(yuǎn)程對象的存根和骨架。存根(S
  tub)是遠(yuǎn)程對象在客戶端的代理,它將RMI調(diào)用傳遞給服務(wù)器端的骨架(Skeleton),
  后者負(fù)責(zé)將該調(diào)用傳遞給實際的遠(yuǎn)程方法。例如執(zhí)行命令rmic com.servletsolutions.
  RMIImplementation,則生成的兩個類文件分別為RMIImplementation_Stub.class 和RM
  IImplementation_Stub.class,前者封裝入Applet且運行于客戶端,后者封裝入Servle
  t且運行與服務(wù)器端。
   當(dāng)大量的數(shù)據(jù)是由服務(wù)器端的對象動態(tài)提供時使用RMI是非常合適的。雖然RMI支持
  面向?qū)ο蟮姆植际骄幊蹋罂蛻舳撕头?wù)器端都是Java程序。因此,對于使用混
  合語言開發(fā)的應(yīng)用來說,CORBA比RMI更為適用。
   四、使用CORBA
   CORBA即公用對象請求代理體系(Common Object Request Broker Architecture)
  ,它的使用方法類似于RMI:定義接口,使用某個工具創(chuàng)建Stub和Skeleton,實現(xiàn)接口,
  在服務(wù)器上注冊后客戶就可以像本地對象一樣訪問遠(yuǎn)程對象了。兩者主要的不同之處在
  于,CORBA使用一種語言中立的接口定義語言(IDL)來定義接口,IDL是一種可用于混合
  語言環(huán)境的更為廣泛的協(xié)議集。CORBA最大的缺點在于客戶本身必須具備調(diào)用ORB的能力
  ,這往往意味著增加一個體積較大的JAR文件。
   下面的CORBAServ2App.idl是上述getData()接口的IDL描述,它定義了一組與Java
  包名字對應(yīng)的嵌套模塊:
  module com {
  module servletsolutions {
  module serv2app {
  module corba {
  interface CORBAServ2App{
  string getData();
  };
  };
  };
  };
  };
   可以用idl2java從IDL文件生成對應(yīng)的java文件。其中_CORBAServ2AppImplBase.j
  ava包含了描述該接口的java抽象類,下面的CORBAImplementation類繼續(xù)自抽象類_COR
  BAServ2AppImplBase并具體實現(xiàn)getData()方法:
  package com.servletsolutions.serv2app.corba;
  public class CORBAImplementation extends _CORBAServ2AppImplBase {
  CORBAImplementation(String s){ super(s); }
  public String getData(){
  return java.text.DateFormat.getDateInstance().format(new java.util.Date());
  }
  }
   為了讓該類可以被客戶訪問,Servlet中還應(yīng)該創(chuàng)建其實例。代碼如下所示:
  // 在Servlet的init()方法中初始化CORBAImplementation對象
  // 其中BOA(Basic Object Adapter)的作用類似于RMI中的注冊服務(wù)
  (程序略)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 若羌县| 驻马店市| 宜宾市| 东丰县| 伽师县| 高密市| 麻城市| 金昌市| 读书| 天镇县| 河西区| 壶关县| 长寿区| 苍梧县| 阳原县| 顺平县| 天水市| 开原市| 偏关县| 盐源县| 东乡| 万全县| 特克斯县| 鹤峰县| 犍为县| 江北区| 太康县| 嵊泗县| 肇东市| 曲靖市| 阳曲县| 北碚区| 登封市| 环江| 隆尧县| 鄢陵县| 射洪县| 绥江县| 青岛市| 河曲县| 阜阳市|