基于RMI技术的远程词典应用.docx
《基于RMI技术的远程词典应用.docx》由会员分享,可在线阅读,更多相关《基于RMI技术的远程词典应用.docx(6页珍藏版)》请在冰点文库上搜索。
基于RMI技术的远程词典应用
1.情景描述
假设有一台应用服务器以RMI的方式向客户端提供英汉互译词典的服务,请尝试完成服务器端程序的编码和一个客户端应用,并分别部署到两台计算机上进行测试。
2.RMI简介
RMI(指远程方法调用)是RemoteMethodInvocation的简称,是一种远程方法调用机制,其过程对于最终用户是透明的。
RMI包含两种组件:
RMI服务器和RMI客户。
RMI有三层架构:
Stub/Skeleton层、远程引用层和传输层。
开发RMI需要以下步骤:
1)根据应用的需要定义远程接口;
2)定义和实现服务器类,其中要实现远程接口中声明的远程方法;
3)定义与实现客户类;
4)完成上述类文件的编程之后,编译源文件生成相应的类文件;5)生成Stub和Skeleton;
6)创建安全策略;
7)启动RMI远程注册表;
8)启动服务器;
9)启动客户,完成应用。
3.基于RMI技术的远程词典应用的实现
在实现基于RMI技术的远程词典应用的过程中,主要实现了三部分:
定义的远程接口,实现远程接口以及服务器端应用服务实现,应用客户端的图形实现。
(1)远程接口的实现
在远程接口的类中,声明了一个返回字符串的translator方法。
实现的代码如下:
packagetranslatorInterface;
importjava.rmi.Remote;
importjava.rmi.RemoteException;
/**
*@author苑仁群
*@since2012.6.4
*/
publicinterfaceTranslatorInextendsRemote{
/**
*
*@paramword输入待查询的单词
*@return返回所查单词的结果
*@throwsRemoteException
*/
publicStringtranslator(Stringword)throwsRemoteException;
}
(2)应用服务端实现
在应用服务端实现了定义的远程接口,并且进行了服务端端口的注册,以及通信路径的
注册。
实现定义的远程接口的代码如下:
packageserver;
importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;importjava.util.HashMap;
importjava.util.Map;
importtranslatorInterface.TranslatorIn;
/**
*
*@author苑仁群
*@since2012.6.4
*/
publicclassTranslatorImextendsUnicastRemoteObjectimplementsTranslatorIn{
privatestaticfinallongserialVersionUID=1L;
privateMapdic=newHashMap();
protectedTranslatorIm()throwsRemoteException{super();
dic.put("distribution","n.分布;分配");dic.put("system","n.系统;方法;制度,体制");
}
@Override
publicStringtranslator(Stringword){
Stringresult=null;result=dic.get(word);if(result==null||result.equals(""))
result="抱歉,您查找的单词不存在";returnresult;
}
}
进行服务端口注册以及通信路径注册的代码如下:
packageserver;
import.MalformedURLException;importjava.rmi.AlreadyBoundException;importjava.rmi.Naming;
importjava.rmi.RemoteException;importjava.rmi.registry.LocateRegistry;importtranslatorInterface.TranslatorIn;
/**
*
*@author苑仁群
*
*/
publicclassServer{
public static void main(String arg[]) throws MalformedURLException,AlreadyBoundException{
try{
TranslatorIndicServer=newTranslatorIm();LocateRegistry.createRegistry(10002);//注册通信端口Naming.bind("rmi:
//127.0.0.1:
10002/dicServer",dicServer);//注册通信路径
}catch(RemoteExceptione){e.printStackTrace();
}
}
}
(3)客户端应用的实现
客户端实现的代码中,其核心方法主要为查找通信路径的Naming.lookup()方法,其代码如下:
packageclient;
importjava.awt.BorderLayout;
importjava.awt.EventQueue;
importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.rmi.Naming;
importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JTextField;importjavax.swing.JTextArea;importjavax.swing.JLabel;
importtranslatorInterface.TranslatorIn;
/**
*
*@author苑仁群
*@since2012.6.4
*/
publicclassDicClient{
privateJFrameframe;privateJTextFieldword;
privateTranslatorIntranslatorIntf;privateJTextAreafindResult;privateJPanelpanel_1;
privateJLabellblNewLabel;privateJLabellblNewLabel_1;
publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){
publicvoidrun(){try{
DicClientdicClient=newDicClient();dicClient.frame.setVisible(true);
}catch(Exceptione){e.printStackTrace();
}
}
});
}
publicDicClient(){initialize();try{
translatorIntf=(TranslatorIn)Naming.lookup("rmi:
//127.0.0.1:
10002/dicServer");
}catch(Exceptione){
findResult.setText("暂时无法连接到服务器,服务器可能没有运行!
");
}
}
/**
*窗口的初始化
*/
privatevoidinitialize(){
frame=newJFrame();
frame.setTitle("欢迎使用词典客户端^_^");frame.setBounds(100,100,300,300);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanelpanel=newJPanel();frame.getContentPane().add(panel,BorderLayout.NORTH);panel.setLayout(newBoxLayout(panel,BoxLayout.X_AXIS));lblNewLabel_1=newJLabel("请输入单词:
");panel.add(lblNewLabel_1);
word=newJTextField();panel.add(word);word.setColumns(8);
JButtonbtnTrans=newJButton("查询");btnTrans.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEventarg0){Stringkeywords=word.getText();
try{
if(keywords.trim().isEmpty()||keywords.trim().equals("")
||keywords.trim()==null)findResult.setText("输入的单词不能为空");
else{
Stringmeaning=translatorIntf.translator(keywords);findResult.setText(meaning);
}
}catch(Exceptione){translatorIntf=null;
findResult.setText("暂时无法连接到服务器,服务器可能没有运行!
");
}
}
});
panel.add(btnTrans);panel_1=newJPanel();
frame.getContentPane().add(panel_1,BorderLayout.CENTER);panel_1.setLayout(newBorderLayout(0,0));
lblNewLabel=newJLabel("查询结果:
");panel_1.add(lblNewLabel,BorderLayout.NORTH);findResult=newJTextArea();findResult.setEditable(false);panel_1.add(findResult,BorderLayout.CENTER);
}
}
4.运行界面
1.没有启动服务端时,客户端的运行界面如下:
2.启动服务器后,客户端的运行界面如下: