你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
4.7 B/S模式中的远程调用(下)
 

/**

 * 服务器端用来接收客户端的信息输入

 *(主要处理方法编号、session编号和参数)

 * 该方法继承自TunnelServlet

 */

public class BusServer extends TunnelServer{

 

  public Object getRealObject()throws ServletException{

    return new BusObject();

  }

  public void executeMethod(Object busObject,

                            int flag,

                            ObjectInputStream objIn,

                            ObjectOutputStream objOut)throws Exception{

    BusObject bus=(BusObject) busObject;

    switch(flag){

      //在这里用户可以根据自己的需要添加对不同方法调用后的处理情况

 

      case 1:  //获取指定路径下的所有的文件名和目录名

        String s=(String) objIn.readObject();

        FileAndDirectory ds=bus.getAllFileName(s);       

        //将结果发送回客户端

        objOut.writeObject(ds);

      break;

      default:  //错误处理

        objOut.writeInt(-2);

        objOut.writeUTF("无效的方法调用");

    }

  }

}

三、应用测试

接下来就可以写小应用程序来测试B/S版的RMI框架了。

.编写客户端小应用程序(BusClient.java

package com.ql.rmibs;

 

import java.awt.*;

import java.awt.event.*;

import java.applet.*;

import javax.swing.*;

import javax.swing.tree.*;

import java.net.*;

import java.io.*;

import java.util.Vector;

 

/**

 * 客户端Applet小应用程序

 *客户端实际上并没有操作真正的商业对象(即服务器上的对象)

 *客户端实际上操作的是一个商业对象的缩影(由商业对象一部分属性构成的新类)

 *主要完成了下面的事情:

 * 告诉服务器调用哪个对象

 * 告诉服务器调用对象的哪个方法

 * 向服务器提供调用对象方法时使用的入口参数

 */

public class BusClient extends JApplet {

  boolean isStandalone = false;

    JTextArea ta=new JTextArea(10,33);

    JLabel lbl1=new JLabel("用户名:"),

                lbl2=new JLabel("密码:"),

                lbl3=new JLabel("指定路径:");

    JTextField tf1=new JTextField(8);

    JPasswordField tf2=new JPasswordField(8);

 

    JTextField tf3=new JTextField(19);

    JButton btn1=new JButton("获取");

    JButton btn=new JButton("连接");

    BusObjectProxy bus;

    String welcome="";

 

  //Construct the applet

  public BusClient() {

  }

 

  //Initialize the applet

  public void init() {

    try  {

      jbInit();

    }

    catch(Exception e)  {

      e.printStackTrace();

    }

  }

 

  //Component initialization

  private void jbInit() throws Exception {

       Container c=getContentPane();

       c.setLayout(new FlowLayout(FlowLayout.LEFT));

       c.add(lbl1);c.add(tf1);

       c.add(lbl2);c.add(tf2);

       c.add(btn);

       c.add(lbl3);c.add(tf3);c.add(btn1);

       c.add(new JScrollPane(ta));

 

       //获取指定目录的所有文件名

       btn1.addActionListener(new ActionListener(){

          public void actionPerformed(ActionEvent e)

          {

                 try

                 {

                     String path=tf3.getText();

                     ta.append("单元测试:获取服务器指定目录"+

                               path+"下的所有文件名和文件夹名"+"\n");  

                     FileAndDirectory fd=bus.getAllFileName(path);

                     Vector v=new Vector();

                     v=fd.getFileArray();

                      ta.append("输出所有的文件名:\n");

                      for(int i=0;i<v.size();i++)

                      {

                         ta.append(v.elementAt(i)+"\n");

                      }

 

                      v=fd.getDirectoryArray();

                      ta.append("输出所有的目录名:\n");

                      for(int i=0;i<v.size();i++)

                      {

                        ta.append(v.elementAt(i)+"\n");

                      }

                  }catch(Exception ex){}

          }

       });

       //登录

       btn.addActionListener(new ActionListener(){

          public void actionPerformed(ActionEvent e)

          {

                 try

                {

                      String name=tf1.getText();

                      String pass=new String(tf2.getPassword());

                      bus=new BusObjectProxy(name,pass);

                      welcome=bus.getWelcome();

                      ta.append(welcome+"\n");

                }catch(Exception ex){

                      ta.append(ex.getMessage()+"\n");

                }

          }

      });

  }

 

  //Get Applet information

  public String getAppletInfo() {

    return "Applet Information";

  }

 

  //Get parameter info

  public String[][] getParameterInfo() {

    return null;

  }

  // static initializer for setting look & feel

  static {

    try {

      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    }

    catch (Exception e) {}

  }

}

.编写嵌入了小应用程序的HTML文件  

BusClient.htm

---------------------------------------------------------------------------------------------

<html>

<head>

  <title>远程方法调用</title>

</head>

<body>

<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

WIDTH = "300" HEIGHT = "300" NAME = "TestApplet" ALIGN = "top" VSPACE = "0" HSPACE = "0"  codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0">

<PARAM NAME = CODE VALUE = "com.ql.rmibs.BusClient.class" >

<PARAM NAME = CODEBASE VALUE = "." >

<PARAM NAME = ARCHIVE VALUE = "rmibs.jar" >

<PARAM NAME = NAME VALUE = "TestApplet" >

 

<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2">

<COMMENT>

<EMBED type="application/x-java-applet;version=1.2" java_CODE = "com.ql.rmibs.BusClient.class" java_CODEBASE = "." java_ ARCHIVE = "rmibs.jar" NAME = "TestApplet" WIDTH = "300" HEIGHT = "300" ALIGN = "top" VSPACE = "0" HSPACE = "0"   pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html"><NOEMBED></COMMENT>

</NOEMBED></EMBED>

</OBJECT>

</body>

</html>

.运行界面图与说明

  签名认证的效果如图3所示,客户端窗口的运行效果如图4所示。


图3签名认证


图4客户端窗口

Applet小程序将随着下载的JAR文件而被解释到客户端的JVM,为了取得客户的信任以便在客户端实现本地方法调用,必须首先获得用户对JAR文件的有效确认,这里选择总是有效,小应用程序的主界面也就跟着出来了。输入正确的用户名和密码(用户名qixiaorui 密码 20000203),进行连接,如果连接成功,则显示“you are welcome!”,在指定路径中输入:d:\\s,单击获取,applet程序将调用远程方法获取到服务器d:\s目录中的所有内容显示出来。借助于这个框架可以完成许多有意义的工作。对分布式程序设计也会有更深刻的印象。

四、部署描述

.服务器端

包容器选择TOMCAT

(1)程序打包

jar cvf rmibs.jar *.*

(2)为生成的jar文件签名(上面已讲过)

Helper类:FileAndDirectory.class

架构类:  BusInterface.classBusObject.classTunnelServer.class

TunnelException.class

(3)将包com.ql.rmibs拷贝到TOMCAT根目录下的..\webapps\rmibs\WEB-INF\classes下,为服务器端服务程序BusServer提供类库支持。

(4)将经过了签名的JAR文件拷贝到TOMCAT根目录下的..\webapps\rmibs下,为客户端applet提供类库支持。

(5)将BusClient.htm拷贝到TOMCAT根目录下的..\webapps\rmibs下,以便客户通过浏览器访问。

(6)在..\webapps\rmibs\WEB-INF中创建web部署描述文件。

web.xml

-------------------------------------------------------------------------------------

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE web-app

    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

 <servlet>

   <servlet-name>BusServer</servlet-name>

   <servlet-class>com.ql.rmibs.BusServer</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>BusServer</servlet-name>

   <url-pattern>/BusServer/*</url-pattern>

 </servlet-mapping>

</web-app>

(7)重新启动TOMCAT服务。

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089