请问applet与servlet间怎么通讯呀

wujj 2002-04-25 09:23:50
给个例子
...全文
8 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zone2000 2002-05-03
你的applet中用到swing控件没?若有,请不要使用
回复
wujj 2002-04-25
我试一下,好用,立即给分
决不失言
回复
thunderJ 2002-04-25
g z
回复
dylanwolf 2002-04-25
贴得 这么辛苦,要求给100分!! 呵呵
回复
dylanwolf 2002-04-25
Applet用Http隧道技术和Servlet通讯

Applet source

import java.io.*;
import java.applet.Applet;
import java.awt.*;

public class TestDataStreamApplet extends Applet
{
String response;
public void init(){

try{
java.net.URL url = new java.net.URL(getDocumentBase(),"servlet/DataStreamEcho");
java.net.URLConnection con = url.openConnection();
con.setUseCaches(true);
con.setDoOutput(true);
con.setDoInput(true);
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(byteout);
out.writeUTF("hello world!");
out.flush();
byte buf[] = byteout.toByteArray();
con.setRequestProperty("Content-type","application/octest-stream");
con.setRequestProperty("Content-length",""+buf.length);
DataOutputStream dataout = new DataOutputStream(con.getOutputStream());
dataout.write(buf);
dataout.flush();
dataout.close();

DataInputStream in = new DataInputStream(con.getInputStream());
response = in.readUTF();
System.out.println("read from server :" + response);
in.close();
}
catch(Exception e){
e.printStackTrace();
}

}

public void paint(Graphics g){
g.drawString("read from server :" + response,10,20);

}
}



Servlet source

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class DataStreamEcho extends HttpServlet{
public void service(HttpServletRequest req,HttpServletResponse resp)
throws ServletException ,java.io.IOException
{
DataInputStream in = new DataInputStream(req.getInputStream());
resp.setContentType("application/octest-stream");
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(byteout);
String response = in.readUTF();
out.writeUTF(response);
out.flush();
byte buf[]= byteout.toByteArray();
resp.setContentLength(buf.length);
ServletOutputStream servletout = resp.getOutputStream();
servletout.write(buf);
servletout.close();
}

}


回复
dylanwolf 2002-04-25
Applet source (partly)

showStatus(textField1.getText());
URL servlet = new URL(this.getDocumentBase(),"servlet/GetParameterServlet");

URLConnection connection = servlet.openConnection();
connection.setUseCaches(false);
connection.setDoOutput(true);

ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024);
PrintWriter out = new PrintWriter(byteStream, true);
String postData = "Name=" + URLEncoder.encode(textField1.getText());
out.print(postData);
out.flush();
String lengthString = String.valueOf(byteStream.size());
connection.setRequestProperty("Content-Length", lengthString);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
byteStream.writeTo(connection.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
textArea1.setText("");
String s;
for(; (s = br.readLine()) != null && s.length() > 0; textArea1.appendText(s + "\n"));
...


Servlet source

// GetParameterServlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;


public class GetParameterServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");

PrintWriter out = response.getWriter();
String title = "Reading Request Parameters";
String name = request.getParameter("Name");
out.println(title);
out.println("Hello: " + name );

}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

回复
wujj 2002-04-25
我用ie打开applet
怎么返回为null
但用AppletViewer aa.htm
可以看到返回结果呀
此问题解决,即全部给分。
谢谢
我的QQ7005900
EMail:wujiajia@163.com
谢谢
回复
dylanwolf 2002-04-25
再贴一点:

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);
}

回复
dylanwolf 2002-04-25
你可以把它放在 doGet(request, response) 里啊.

什么bug?
回复
wujj 2002-04-25
我有ie中调用这个applet
返回的结果是 null
怎么回事呀
回复
wujj 2002-04-25
请问这个servlet 请求怎么会是service呀
怎么不是doget或dopost


另外
我用javac DataStreamEcho.java
有一堆的bug.
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告