当前位置:  技术问答>java相关

请问applet的问题

    来源: 互联网  发布时间:2015-05-22

    本文导语:  请问除了全局变量,applet和servlet怎样进行通讯? | Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,作为回答,Servlet将结果生成HTML文档发送给浏览器。很多时候在Servlet...

请问除了全局变量,applet和servlet怎样进行通讯?

|
Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,作为回答,Servlet将结果生成HTML文档发送给浏览器。很多时候在Servlet与Applet之间建立直接的联系是没有必要的,但如果要显示一些实时的动态数据,如聊天室窗口、新闻显示、股市行情等,建立两者之间的直接联系就很有用了。特别地,在较为复杂的分布式Java应用中,这种通讯更是必不可少。在客户端Java程序与服务器端Java程序之间建立这种复杂的交互方式仅仅使用Servlet与Applet API是不够的,本文为你介绍和比较四种通讯方式:通过HTML页面传递参数,用java.net包的网络功能建立直接网络连接,远程方法调用(RMI)与CORBA。 
   一、通过HTML页面传递Applet参数 

   通过HTML页面传递参数是在Servlet与Applet之间建立联系最为常用的方法。Servlet只要把传递给Applet的参数写入HTML页面就可以了。这种通讯是单向的,用于实现Servlet对Applet的控制。其实现方法类如: 
// doGet()方法生成一个包含Applet的HTML页面, 
// 该Applet需要一个Data参数 

public void doGet(HttpServletRequest request,HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html"); 
PrintWriter out = new PrintWriter ( response.getOutputStream()); 
out.write(" HTML Example "); 
out.write("Servlet通过PARAM标记传递参数给Applet. "); 
out.write(""); 
// 写入PARAM标记 
out.write(""); 
out.close(); 


   这种方法很简单,但它有两个缺点。首先,所有参数都是静态的,即一旦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.getOutputStream())); 
// 处理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.RemoteException异常。 

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

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

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

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

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

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

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

   下面的代码实现一个返回日期字符串的getData()远程方法,该方法由接口RMIServ2App定义: 
// 本类继承自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().getHost() + "/ServerName"); 

   除了编译Java代码之外,还要用rmic编译器生成远程对象的存根和骨架。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法。例如执行命令rmic com.servletsolutions.RMIImplementation,则生成的两个类文件分别为RMIImplementation_Stub.class 和RMIImplementation_Stub.class,前者封装入Applet且运行于客户端,后者封装入Servlet且运行与服务器端。 

   当大量的数据是由服务器端的对象动态提供时使用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.java包含了描述该接口的java抽象类,下面的CORBAImplementation类继承自抽象类_CORBAServ2AppImplBase并具体实现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中的注册服务 

public class CORBAServlet extends HttpServlet{ 
String CORBAName; 
public void init( 
ServletConfig config) throws ServletException { 
super.init(config); 
try { 
CORBAName = getInitParameter("CORBAName"); 
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(); 
org.omg.CORBA.BOA boa = orb.BOA_init(); 
com.servletsolutions.serv2app.corba.CORBAServ2App implObject = 
new CORBAImplementation(CORBAName); 
boa.obj_is_ready(implObject); 
boa.impl_is_ready(); 

catch (Exception e) { 
e.printStackTrace(); 



   IDL2Java同时为客户端生成CORBAServ2AppHelper类,Applet通过该类与服务器交互。

    
 
 

您可能感兴趣的文章:

  • 请问application (or applet)如何实现对applet 小程序的调用??
  • 请问能在浏览器调入APPLET后,在APPLET内部改变其自身的大小嘛?
  • 一个父类的构造函数的参数是(Applet applet),请问它的子类构造函数当中应怎样调用父类构造函数?
  • 请问一下, 我用applet和服务器socket通信, 是不是不能用IE浏览运行我的applet程序?
  • 请问HTML中嵌入JAVA APPLET的具体格式是什么?
  • 请问各位高手,Applet怎么编译,又怎么运行?
  • 请问如何在Applet中关闭其所在的页面?
  • 请问如何让IE显示带Applet的html?
  • 请问在网页中两个Applet如何互相调用
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问applet高手
  • 请问在applet中如何调用javabean?
  • 请问applet怎么在一装载时先接受jsp页面里传递的一个参数?比如。。。
  • 请问用applet直接连接服务器上的数据库的办法是否安全
  • 请问:在applet里怎样才能修改win32的注册表?
  • 请问在Applet里面怎样弹出一个对话框
  • 请问:jsp 和 applet怎样通信/? 问题解决给高分!!!!!!!!!!!!!!
  • 请问如何在IE中运行含有Jbuilder的JBCL控件的Applet?
  • 请问高手:我想用applet调用一个本地的exe。怎么办?
  • 请问用JBuilder开发Applet,如果把鼠标指针变成漏斗?
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问linux下GUI开发的问题!
  • 请问一个奇怪的问题!
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待
  • 请问安装zhcon,cxterm问题
  • 请问如何在一台单机上装VMware的网络访问问题?
  • 请问adduser的一个问题!
  • 请问在Jbuilder 7中, 做swing界面, 用JDK1.4,怎么解决中文显示问题?
  • 请问一个很菜的问题
  • 请问关于为redhat7.2设置多IP问题?急!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • (急)请问大侠,JDK怎么配置?
  • 请问机器升级后,编译为何出错?
  • 请问一下,汇编器as是否就是gas?
  • 我在linux中把 网卡删除了,请问如何将他安装?
  • CSS属性参考手册 iis7站长之家
  • 请问vi文中的替换命令


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3