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

最近被applet和servlet的通讯所困,希望哪位高人能给个简单明了的例子,详情见内.

    来源: 互联网  发布时间:2015-02-23

    本文导语:  最近被applet和servlet的通讯所困,csdn已有的相关帖子,已看过,但收获不大. applet和servlet的4种通讯方法,我希望能得到HTTP或socket或RMI的简单例子 我的系统是win2000server+tomcat3.2.1+jdk1.3.1,所给例子请注明applet,html的存放路径和se...

最近被applet和servlet的通讯所困,csdn已有的相关帖子,已看过,但收获不大.
applet和servlet的4种通讯方法,我希望能得到HTTP或socket或RMI的简单例子
我的系统是win2000server+tomcat3.2.1+jdk1.3.1,所给例子请注明applet,html的存放路径和servlet的存放路径

|
我有一个例子,自己做的。
分别是APPLET和SERVLET

APPLET--------
import java.io.*;
import java.awt.*;
import java.applet.*;

public class SerAndApp extends Applet implements Runnable
{
  int i;
  String response;
  Thread theThread;

  TextArea messInfo=new TextArea("hi",16,45);
  TextField txtDbIP=new TextField(30)
           ,txtPort=new TextField(4)
           ,txtUID=new TextField(10)
           ,txtPass=new TextField(10)
           ,txtSql=new TextField(30);
  Button btnConnect=new Button("Connect");

  public void init()
  {

    this.setSize(500,300);

    setLayout(new BorderLayout());
    Panel mainPanel=new Panel();
    Panel panel1=new Panel();
    Panel panel2=new Panel();
    Panel panel3=new Panel();

    messInfo.setEditable(false);
    add("North",messInfo);
    //add("North",panel1);

    panel2.add(new Label("数据库IP:"));
    panel2.add(txtDbIP);
    panel2.add(new Label("断口:4444"));
    panel2.add(txtPort);
    add("Center",panel2);

    panel3.add(new Label("用户名:"));
    panel3.add(txtUID);
    panel3.add(new Label("密码:"));
    panel3.add(txtPass);
    panel3.add(btnConnect);
    add("South",panel3);

    theThread=new Thread(this);
  }

  public void start()
  {
    theThread.start();
  }

  public void run()
  {

    while(true)
    {
      i++;
      this.req();

     // Graphics g=getGraphics();
      //g.drawString("read from server:"+this.response,10,20*i);
      //g.dispose();
      this.messInfo.append("read from server:"+this.response);
      try
      {
        theThread.sleep(2000);
      }
      catch(InterruptedException e){}
    }

  }

  public void req()
  {
    try
    {
      java.net.URL url=
            new java.net.URL(getDocumentBase(),"/servlet/SerAndApp");
      java.net.URLConnection con=
            url.openConnection();
      con.setUseCaches(false);
      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/octet-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());
      this.response=in.readUTF();
      //repaint();
      //System.out.println("read from server:"+response);

      in.close();
    }
     //catch(java.net.MalformedURLException e){}
     catch(Exception e){}
  }

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


SERVLET------------
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;


public class SerAndApp extends HttpServlet{
  String respData;
  public void service(HttpServletRequest req,HttpServletResponse resp)
  {
    try
    {
      DataInputStream in=new DataInputStream(req.getInputStream());
      resp.setContentType("application/octet-stream");
      ByteArrayOutputStream byteout=new ByteArrayOutputStream();
      DataOutputStream out=new DataOutputStream(byteout);
      //String response=in.readUTF();
      this.getDbData();
      String response="  "+this.respData+"  "+this.nowTime()+"n";
      out.writeUTF(response);
      out.flush();
      byte buf[]=byteout.toByteArray();
      resp.setContentLength(buf.length);
      ServletOutputStream servletout=resp.getOutputStream();
      servletout.write(buf);
      servletout.close();
    }catch(java.io.IOException e){}
  }


  public void getDbData()
  {

      try
      {

     String url="jdbc:freetds:sqlserver://202.121.67.141:1433/Graduate";
     String driver="com.internetcds.jdbc.tds.Driver";

       Class.forName(driver).newInstance();

       String login = "sa";
       String password = "";
       Connection con=DriverManager.getConnection(url,login,password);

       Statement st = con.createStatement();
       ResultSet rs = st.executeQuery("SELECT * FROM PictureTest");

       rs.next();
       this.respData=String.valueOf(rs.getInt("ID"))+"tttt";

       st.close();
       con.close();

       }
        catch(java.sql.SQLException e){System.out.println(e.toString());}
        catch(java.lang.ClassNotFoundException e){System.out.println(e.toString());}
        catch(java.lang.InstantiationException e){System.out.println(e.toString());}
        catch(java.lang.IllegalAccessException e){System.out.println(e.toString());}
   }

  public void getDbData1()
  {

      try
      {

     String url="jdbc:freetds:sqlserver://202.121.64.252:1433/test";
     String driver="com.internetcds.jdbc.tds.Driver";

       Class.forName(driver).newInstance();

       String login = "test";
       String password = "test";
       Connection con=DriverManager.getConnection(url,login,password);

       Statement st = con.createStatement();
       ResultSet rs = st.executeQuery("SELECT LawType FROM Law");

       rs.next();
       this.respData=String.valueOf(rs.getInt("LawType"))+"  时间:";

       st.close();
       con.close();

       }
        catch(java.sql.SQLException e){System.out.println(e.toString());}
        catch(java.lang.ClassNotFoundException e){System.out.println(e.toString());}
        catch(java.lang.InstantiationException e){System.out.println(e.toString());}
        catch(java.lang.IllegalAccessException e){System.out.println(e.toString());}
  }

  public String nowTime()
  {
    java.util.Calendar currTimeCal=java.util.Calendar.getInstance();
    int currDate=currTimeCal.get(Calendar.DATE);
    int currYear=currTimeCal.get(Calendar.YEAR);
    int currMonth=currTimeCal.get(Calendar.MONTH);
    int currHour=currTimeCal.get(Calendar.HOUR_OF_DAY);
    int currMinute=currTimeCal.get(Calendar.MINUTE);
    int currSecond=currTimeCal.get(Calendar.SECOND);

    String currTime=String.valueOf(currYear)
               +"-"+String.valueOf(currMonth)
               +"-"+String.valueOf(currDate)
               +":"+String.valueOf(currHour)
               +":"+String.valueOf(currMinute)
               +":"+String.valueOf(currSecond);


    return currTime;
  }
}



|
简单一点的:
applet-------------
import java.io.*;
import java.awt.*;
import java.applet.*;

public class SerAndApp extends Applet 
{
 String response;

  public void init()
  {

    try
    {
      java.net.URL url=
            new java.net.URL(getDocumentBase(),"/servlet/SerAndApp");
      java.net.URLConnection con=
            url.openConnection();
      con.setUseCaches(false);
      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/octet-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());
      this.response=in.readUTF();
      System.out.println("read from server:"+response);

      in.close();
    }
     catch(Exception e){}
  }

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

servlet-------------
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;


public class SerAndApp extends HttpServlet{
  String respData;
  public void service(HttpServletRequest req,HttpServletResponse resp)
  {
    try
    {
      DataInputStream in=new DataInputStream(req.getInputStream());
      resp.setContentType("application/octet-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();
    }catch(java.io.IOException e){}
  }


}



|
              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 CORBAServ 

    
 
 

您可能感兴趣的文章:

  • applet发布的问题,高人看过来
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有没有专门介绍APPLET的书,和例子
  • 谁有APPLET画饼图的例子???谢谢!
  • Applet怎样向Servlet声请动态网页,请给一个例子。
  • 再散分。谁能给一些Applet画图的源码例子,给连接也行。
  • 哪位兄弟愿提供一APPLET与SERVLET通讯的通过调试的简单例子,立刻赠100分!!!
  • 请问谁有Applet连接远程Access数据库并且显示数据库内容的例子!
  • 请问applet如何通过javabean访问数据库?给个例子,谢谢
  • 有谁就用PopupMenu在applet里面写弹出菜单,请给个例子
  • 给applet加一个安全证书是怎么实现的呢?最好有例子!
  • 谁有applet存数据到数据库的例子啊,给我发一个吧
  • 那位朋友可以给个applet通过servlet取数据库数据的例子?多谢!
  • java命名空间java.applet类applet的类成员方法: applet定义及介绍
  • 如何让Applet里的控件随着Applet大小改变而一直占满整个Applet呢?
  • java命名空间java.applet类applet.accessibleapplet的类成员方法: applet.accessibleapplet定义及介绍
  • 对applet坐数字签名后,如果重新用jar对applet打包,需要重新做applet数字签名吗?
  • java命名空间java.applet类applet的类成员方法: getappletcontext定义及介绍
  • 为什么我的applet编译完,之后除了applet1.class之外,还有一个applet$1.class?
  • java命名空间java.applet类applet的类成员方法: getappletinfo定义及介绍
  • 急,我想问一下调用一个对话框的命令语句,比方说我已建立了一个Applet2,接下来该如何在Applet1中点击一个按钮来打开这个Applet2.谢谢
  • java命名空间java.applet类applet的类成员方法: isactive定义及介绍
  • 如何让IE认识applet所带的数字签名,而不是让证书仓库认识这个带数字签名的applet,就是说不装jdk也可以在IE里面使用带有签名的applet,详情请进
  • java命名空间java.applet类applet的类成员方法: stop定义及介绍
  • 请问application (or applet)如何实现对applet 小程序的调用??
  • java.applet类applet的类成员方法: getcodebase定义及介绍
  • 请问能在浏览器调入APPLET后,在APPLET内部改变其自身的大小嘛?
  • java命名空间java.applet类applet的类成员方法: init定义及介绍
  • applet 如何启动新的 applet
  • java命名空间java.applet类applet的类成员方法: destroy定义及介绍
  • 如何把applet窗口里的Java Applet Window去掉?
  • java命名空间java.applet类applet的类成员方法: getparameterinfo定义及介绍
  • Applet对本地资源是不能访问的,那如果我要用Applet做打印设计,那如何是好呢??


  • 站内导航:


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

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

    浙ICP备11055608号-3