2007年5月10日星期四

jsp与applet交互问题

Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,作为回答,Servlet将结果生成HTML文档发送给浏览器。很多时候在Servlet与Applet之间建立直接的联系是没有必要的,但如果要显示一些实时的动态数据,如聊天室窗口、新闻显示、股市行情等,建立两者之间的直接联系就很有用了。特别地,在较为复杂的分布式Java应用中,这种通讯更是必不可少。在客户端Java程序与服务器端Java程序之间建立这种复杂的交互方式仅仅使用Servlet与Applet只依靠API是不够的。
很简单,你可以使用 java.net.URLConnection 和 java.net.URL类来打开一个标准的 HTTP连接,与web 服务器取得连接。服务器随后以通常的方式将这一信息传送给servlet。基本上,applet可以看作是一个a web浏览器,servlet并不能区分这2者。对servlet来说,applet仅仅是另一个HTTP客户。
当然,你可以写一个servlet,专门由你的applet对它进行调用,在这种情况下servlet确实能知道2者的差别。你也可以在一个客户段TCP端口打开一个ServerSocket,然后让你的applet打开一个 Socket连接。然后你必须设计和实现一个客户段socket-level协议来对通信进行处理。这就是你可以写的东西。例如,一个聊天applet和一个servlet进行通信。总之,做一个客户端协议相比用HTTP要花费更多工作量,但更灵活。但是,客户端协议要花费长时间来通过防火墙。
一、通过HTML页面传递Applet参数:
通过HTML页面传递参数是在Servlet与Applet之间建立联系最为常用的方法。Servlet只要把传递给Applet的参数写入HTML页面就可以了。这种通讯是单向的,用于实现Servlet对Applet的控制。
这种方法很简单,但它有两个缺点。首先,所有参数都是静态的,即一旦HTML页面发送完成,要更新其中部分数据就很困难了。虽然可以使用HTTP的刷新机制,但这种刷新需要重新下载整个页面,效率是很低的。第二,如果需要传递给Applet的数据量很大或数据结构很复杂,就会使得HTML页面过于庞大或复杂了。
二、用java.net包建立双向通讯
   第二种方法是利用java.net包提供的网络能力。以有连接流通讯方式为例。
1在服务器端的操作为一般为:
   ⑴ 创建一个ServerSocket对象,在指定端口监听客户端发来的请求。
   ⑵ 在接收到请求时accept()方法将返回一个Socket对象。
   ⑶ 用上述Socket对象创建输入、输出流对象。
   ⑷ 通过输入、输出流与客户交互。
   ⑸ 交互完毕,关闭输入、输出流与Socket。
   ⑹ 服务程序运行结束,关闭ServerSocket。
2在客户端的操作为:
⑴ 创建Socket对象建立与服务器的连接。
⑵ 用该Socket对象创建输入、输出流。
⑶ 与服务器交互。
⑷ 交互完毕,关闭输入、输出流与Socket。
  这种方法只依赖于标准的Java网络支持,不需要用到附加的软件包或工具, 因此显得相当简洁和灵活,易于实现某些特殊的需要。但在另一方面,服务器端对进入请求以及客户端对返回结果的分析工作量较大。如果服务器端要执行大量的操作,可以考虑使用RMI。

没有评论: