分享
 
 
 

Applet与Servlet通讯的四种方法及其比较

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,

作为回答,Servlet将结果生成Html文档发送给浏览器。很多时候在Servlet与Applet之

间建立直接的联系是没有必要的,但假如要显示一些实时的动态数据,如聊天室窗口、

新闻显示、股市行情等,建立两者之间的直接联系就很有用了。非凡地,在较为复杂的

分布式java应用中,这种通讯更是必不可少。在客户端Java程序与服务器端Java程序之

间建立这种复杂的交互方式仅仅使用Servlet与Applet API是不够的,本文为你介绍和比

较四种通讯方式:通过HTML页面传递参数,用java.net包的网络功能建立直接网络连接

,远程方法调用(RMI)与CORBA。

一、通过HTML页面传递Applet参数

通过HTML页面传递参数是在Servlet与Applet之间建立联系最为常用的方法。Serv

let只要把传递给Applet的参数写入HTML页面就可以了。这种通讯是单向的,用于实现S

ervlet对Applet的控制。其实现方法类如:

// doGet()方法生成一个包含Applet的HTML页面,

// 该Applet需要一个Data参数

这种方法很简单,但它有两个缺点。首先,所有参数都是静态的,即一旦HTML页面

发送完成,要更新其中部分数据就很困难了。虽然可以使用HTTP的刷新机制,但这种刷

新需要重新下载整个页面,效率是很低的。第二,假如需要传递给Applet的数据量很大

或数据结构很复杂,就会使得HTML页面过于庞大或复杂了。

二、用java.net包建立双向通讯

第二种方法是利用java.net包提供的网络能力。以有连接流通讯方式为例,在服务

器端的操作为一般为:

⑴ 创建一个ServerSocket对象,在指定端口监听客户端发来的请求。

⑵ 在接收到请求时accept()方法将返回一个Socket对象。

⑶ 用上述Socket对象创建输入、输出流对象。

⑷ 通过输入、输出流与客户交互。

⑸ 交互完毕,关闭输入、输出流与Socket。

⑹ 服务程序运行结束,关闭ServerSocket。

实现代码代码类如:

try{

boolean flag=true;

Socket clientSocket=null;

ServerSocket serverSocket = new ServerSocket(0);

System.out.PRintln("Server listen on: " +serverSocket.getLocalPort());

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);

}

在客户端的操作为:

⑴ 创建Socket对象建立与服务器的连接。

⑵ 用该Socket对象创建输入、输出流。

⑶ 与服务器交互。

⑷ 交互完毕,关闭输入、输出流与Socket。

实现代码类如:

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);

}

这种方法只依靠于标准的Java网络支持,不需要用到附加的软件包或工具, 因此

显得相当简洁和灵活,易于实现某些非凡的需要。但在另一方面,服务器端对进入请求

以及客户端对返回结果的分析工作量较大。假如服务器端要执行大量的操作,可以考虑

使用RMI。

三、远程方法调用RMI

Java的RMI技术显著地改善了客户程序操作复杂的服务器端对象的能力。对Applet

来说,服务器端对象所提供的远程方法可以象普通的客户端句柄一样调用。使用RMI时应

先定义远程接口,即一个继续自java.rmi.Remote的公用接口。在该接口中定义要求在服

务器上运行的方法,所有这些方法的throws子句至少应该声明java.rmi.RemoteExcepti

on异常。

接下来是实现远程接口,远程接口的实现类应该:

⑴ 指定所实现的一个或多个接口。

⑵ 定义远程对象的构造方法。

⑶ 提供所有可供远程调用的方法的实现。

⑷ 创建和安装安全治理器。

⑸ 创建一个或多个远程对象实例。

⑹ 注册至少一个远程对象。

下面的代码实现一个返回日期字符串的getData()远程方法,该方法由接口RMISer

v2App定义:

// 本类继续自UnicastRemoteObject,实现接口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{

// 远程对象实例

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的引用通过调用Naming.lookup(String)获得

,如下所示:

RMIServ2App obj = (RMIServ2App)Naming.lookup("//" + getCodeBase().getHo

st() + "/ServerName");

除了编译Java代码之外,还要用rmic编译器生成远程对象的存根和骨架。存根(S

tub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),

后者负责将该调用传递给实际的远程方法。例如执行命令rmic com.servletsolutions.

RMIImplementation,则生成的两个类文件分别为RMIImplementation_Stub.class 和RM

IImplementation_Stub.class,前者封装入Applet且运行于客户端,后者封装入Servle

t且运行与服务器端。

当大量的数据是由服务器端的对象动态提供时使用RMI是非常合适的。虽然RMI支持

面向对象的分布式编程,但它要求客户端和服务器端都是Java程序。因此,对于使用混

合语言开发的应用来说,CORBA比RMI更为适用。

四、使用CORBA

CORBA即公用对象请求代理体系(Common Object Request Broker Architecture)

,它的使用方法类似于RMI:定义接口,使用某个工具创建Stub和Skeleton,实现接口,

在服务器上注册后客户就可以像本地对象一样访问远程对象了。两者主要的不同之处在

于,CORBA使用一种语言中立的接口定义语言(IDL)来定义接口,IDL是一种可用于混合

语言环境的更为广泛的协议集。CORBA最大的缺点在于客户本身必须具备调用ORB的能力

,这往往意味着增加一个体积较大的JAR文件。

下面的CORBAServ2App.idl是上述getData()接口的IDL描述,它定义了一组与Java

包名字对应的嵌套模块:

module com {

module servletsolutions {

module serv2app {

module corba {

interface CORBAServ2App{

string getData();

};

};

};

};

};

可以用idl2java从IDL文件生成对应的java文件。其中_CORBAServ2AppImplBase.j

ava包含了描述该接口的java抽象类,下面的CORBAImplementation类继续自抽象类_COR

BAServ2AppImplBase并具体实现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中还应该创建其实例。代码如下所示:

// 在Servlet的init()方法中初始化CORBAImplementation对象

// 其中BOA(Basic Object Adapter)的作用类似于RMI中的注册服务

(程序略)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有