JAVA EVERY DAY

DAY DAY UP , STUDY HARD

常用链接

统计

积分与排名

developerWorks Sites

Java

JBlog

OpenSource

最新评论

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><  HEAD><  TITLE>  HTML  Example<  /TITLE>  <  /HEAD><  BODY>");    
out.write("Servlet通过PARAM标记传递参数给Applet.  ");    
out.write("<  APPLET  code=\"SimpleApplet\"  width=\"225\"  height=\"149\">");    
//  写入PARAM标记    
out.write("<  param  name=\"Data\"  value=\"");    
out.write(java.text.DateFormat.getDateInstance().format(new  java.util.Date()));    
out.write("\"><  /APPLET><  /BODY><  /HTML>");    
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。    

posted on 2006-12-13 14:27 没有鱼的水 阅读(201) 评论(0)  编辑  收藏 所属分类: Java study


只有注册用户登录后才能发表评论。


网站导航: