/**
* 服务器端用来接收客户端的信息输入
*(主要处理方法编号、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框架了。
1.编写客户端小应用程序(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) {}
}
}
2.编写嵌入了小应用程序的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.运行界面图与说明
签名认证的效果如图3所示,客户端窗口的运行效果如图4所示。
图3签名认证
图4客户端窗口
Applet小程序将随着下载的JAR文件而被解释到客户端的JVM,为了取得客户的信任以便在客户端实现本地方法调用,必须首先获得用户对JAR文件的有效确认,这里选择总是有效,小应用程序的主界面也就跟着出来了。输入正确的用户名和密码(用户名qixiaorui 密码 20000203),进行连接,如果连接成功,则显示“you are welcome!”,在指定路径中输入:d:\\s,单击获取,applet程序将调用远程方法获取到服务器d:\s目录中的所有内容显示出来。借助于这个框架可以完成许多有意义的工作。对分布式程序设计也会有更深刻的印象。
四、部署描述
1.服务器端
包容器选择TOMCAT
(1)程序打包
jar cvf rmibs.jar *.*。
(2)为生成的jar文件签名(上面已讲过)
Helper类:FileAndDirectory.class
架构类: BusInterface.class,BusObject.class,TunnelServer.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服务。
|