分类: Java
2008-04-25 15:37:21
在本章将讲述几个applet和servlet通信的示范。我们从一个与你的期望略微不同的角度来讲述本章。我们不是假定你有一个applet和一个servlet,而且他们之间要进行通信,而是假设有一个applet要与一个服务器端的实体进行通信,这个实体有时是servlet。
首先,我们假设有一个applet要与server进行通信。这种情况经常存在,例如,Java Web Server的administrator applet用来管理整个 Web Server ,它在客户端的执行,却管理服务器。要完成这项工作,applet和server之间要建立一个连续的通信。再来看另外的一个例子,当今最流行的applet聊天室,一个客户发出的消息,其它的人都看得到。它们是怎么工作的呢?当然不是applet与applet通信,而是每个applet把它的消息发送给一个中央server,中央server负责把消息更新到每个客户端。还有,我们假设用一个applet来显示一系列的股票的价格并提供一个连续(实时)的更新,还有更重要的是,applet怎么知道股票的价格发生了变化,答案是它和它的服务器进行的通信。
9.1 applet 与server通信的几种方式
applet有两种方式,trusted 和untrusted(在安全部分详细论述),它们的主要不同是untrusted applet 在SecurityManger管理下运行,它不能向客户端的文件系统中写入内容,也不能访问系统的特定的属性、接受新的连接请求、建立到除server外的其它socket等。
通常我们说的applet与server 的通信指的是untrusted的 applet。概括来讲,applet与server 的通信有以下几种方式:
在JDK1.1和servlet之前,它们是主要的applet-server通信方式。
(1)HTTP :用applet和服务器上的CGI程序建立一个HTTP连接,在这种通信方式中,applet像一个浏览器,请求一个页面,并分析服务器的响应来为applet使用。applet可以用POST方法向服务器提供信息也能接收服务器在返回的页面中的信息。
HTTP方式的优点:
l 容易编写。applet可以利用java.net.URL和java.net.URLConnection类等优势对通信进行管理,CGI程序可以和其它的CGI程序一样。
l applet在防火墙后运行时也可以与server进行通信,防火墙允许HTTP连接通过,但通常不允许原始的套接口连接
l 允许applet与其他语言写的程序进行通信,CGI可以不用java,例如可以用c、c++、perl等。
l 允许加密通信,applet可以和server用加密的协议HTTPS(HTTP + SSL)和server进行通信。
l CGI可以被applet和浏览器同时进行访问
HTTP方式的缺点:
l 速度慢。由于HTTP和request/response模式,applet和CGI程序之间的通信不能交互。它们必须为每个request和response建立一个新的通信,CGI程序运行和初始化以处理一个request时时延是明显存在的。
l 它通常要求request把参数组织成难用的name/value值的数组的形式。
l 它强制response按照以前定义好的格式来组织。
l 只有 applet可以初始化通信。CGI程序在作出response之前,只能被动的等待一个applet的request。
(2)套接口(socket):applet可以在没有HTTP服务的server的机器上建立一个原始的套接口连接来实现applet-server通信。server 在特定的端口监听,用它们特定的协议进行通信。
套接口方式的优点:
l 它提供了一个双向的、持续的通讯。applet和servlet用同一个(甚至是几个)套接口进行交互式通信,信息可以双向发送。为了安全,applet通过向服务器的一个套接口建立连接来开始通信,一旦套接口建立成功,双方在任何时间都可以向套接口发送信息。
l 它使许多高效的程序运行在服务器端,无HTTP服务的服务器可以不运行CGI程序来处理一个请求。
套接口方式的缺点:
l applet在防火墙后运行时无效。
l 服务器端的程序比较复杂。
l 需要形成特殊的协议。
l 无HTTP服务的服务器无法与web 浏览器进行交互。
java servlet 和对象串行化技术是一种新的applet-server通信技术。Servlet正在取代运行速度较慢的CGI程序,提高基于HTTP的applet-server通信的效果,使经常发生applet-server通信变的可能。虽然通常applet和servlet为每一个request和response建立连接仍需要时间,但是,applet不需要等待CGI程序运行来再来处理request的时间。
Java的对象串行化简化了有关格式化response的问题。由于servlet和applet都是用java写的,很自然的它们之间的通信可以通过交换java 对象来实现。
JDBC(Java DataBase Connectivity )API,允许java程序访问本机或其它机器上相关的数据库。JDBC允许applet直接访问数据库,而不通过applet-server 方式。但是applet通过servlet来访问数据库比直接访问数据库更具有优势。
RMI(Remote Method Invocation)API ,允许applet调用服务器上运行的java 对象的方法,在某些情况下,它也允许服务器调用applet的方法
RMI的优势:
l 它允许applet和server之间用一种高水平的,面向对象的模式进行通信。如果必要request可以作为方法调用,传递串行化对象的参数。Response可以作为串行化的对象被接收,或者作为远程对象的参数被接收。在这里提response和request主要是和以前的HTTP方式做比较,其实,在RMI中,只有方法调用,没有request和response。
l 它允许服务器的对象调用applet 的方法。
l 可以在防火墙后运行,因为其连接是包含在(HTTP协议内的)
RMI的缺点
l 实现复杂。RMI通信用对应每一个远程对象都有特殊的类,客户端想要获得远程对象的参数的话,都需要进行注册。
l 只有少数浏览器支持RMI方法。NetScape Navigator 4支持,而 IE 不支持。
l 只有java 的客户端被支持。
CORBA(Common Object Request Broker Architecture)是一个与RMI类似的方法。不过,客户端可以是任何语言写的程序。