社区
Web 开发
帖子详情
applet和servlet如何通信?
robert2man
2001-07-31 08:52:03
applet做前台,servlet在web server上与db连接,
applet和servlet怎么相互调用?
...全文
257
7
打赏
收藏
applet和servlet如何通信?
applet做前台,servlet在web server上与db连接, applet和servlet怎么相互调用?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
MoreBug
2001-08-07
打赏
举报
回复
可是我在applet中怎么也无法正确创建套接字啊,编程环境是VJ6.0。
ouxing
2001-08-01
打赏
举报
回复
转载自....(Sorry,忘记了作者名称)
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。
三、远程方法调用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 CORBAServ
tiangou
2001-08-01
打赏
举报
回复
高!
ExitWindows
2001-07-31
打赏
举报
回复
up
ExitWindows
2001-07-31
打赏
举报
回复
up
javaservlet
2001-07-31
打赏
举报
回复
用URL,sock or RMI...
ExitWindows
2001-07-31
打赏
举报
回复
up
记武汉疫情期间的一次数据库和翻译记忆库的数据恢复 (一)
记武汉疫情期间的一次数据库和翻译记忆库数据恢复 (一) 本文目的为未来自己或他人进行翻译记忆库数据恢复做参考,会保留技术细节,但其中涉及到很多客户的具体信息以免信息泄露尽量都已隐去, 截图部分都是在自己环境模拟的截图,不是客户真实情况截图 因为众所周知的原因,武汉地区从十二月底左右进入全面封锁状态,企业也同时停工停产,终于在全国医生护士的努力和全国人民的支持,五一前武汉各个企事业单位逐步恢复了生产...
武汉为什么进不了互联网第一梯队?
作者 |盛佳莹、张帆 本文经授权转自猎云网(ID:ilieyun) 从2011年以前双创在武汉萌芽,到现在力争互联网第四极,看武汉的互联网企业如何成长。 艰难中萌芽 2011年高考前夕,付小龙坐在宿舍里用人生第一台智能手机听广播,电台里正在讲述姚欣休学创业做出了用户量逾4亿的视频平台PPTV。 夜深人静时,仿佛有什么东西击中了付小龙的内心,“像姚欣一样‘开公司,...
武汉话
武汉话是一个很有特色的地方方言,在这里搜集一些共享给大家。也希望武汉的朋友能继续进行补充。
1.“您家” 发音要比文字更有特色,两个字连在一起,特别的有味道。是武汉的一尊称、客气的称谓,同“您”
2.“又尖又屁又过细”--指非常小气
3.“信了你的邪” --真是服了你
4.“服了你的周” --真是服了你
5.“怀” --很没用的意思,如“你真怀”,就是,“你真没用”
武汉有哪些值得加入的互联网公司?
前段看到一篇有关武汉互联网公司的汇总,可以说很详细了,虽说无法保证数据的绝对准确,但还是值得参考一波的,有需要的同学可以看一看,这里也分享给大家,也欢迎大家补充和分享。
武汉适合几月份去旅游 武汉必去景点
封闭多时的武汉终于迎来了解封,这无疑是令人欣喜若狂的,武汉不仅是一座英雄的城市,同时也是一座值得一去的旅游城市,那么武汉适合几月份去旅游呢?武汉必去景点有哪些?一起了解一下吧。 武汉适合几月份去旅游 最佳旅游时间:春、秋两季 武汉号称是中国三大火炉之一,那里的夏天非常闷热,即使是站在长江边,也没有一丝风。整个夏季都会有十几天40℃以上的酷暑天气。所以到武汉旅游一定要避开夏季,特别避开是闷热的7、8月份,否则火辣辣的太阳会晒得你游兴全无;而武汉的冬天又十分阴冷,也不适宜去。 春季推荐 春季是百花盛开的季节。此
Web 开发
81,108
社区成员
341,721
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章