基于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;privateMapString,Stringdic=newHashMapString,String();protectedTranslatorIm()throwsRemoteException{super();dic.put(distribution,n.分布;分配);dic.put(system,n.系统;方法;制度,体制);}@OverridepublicStringtranslator(Stringword){Stringresult=null;result=dic.get(word);if(result==null||result.equals())result=抱歉,您查找的单词不存在;returnresult;}}进行服务端口注册以及通信路径注册的代码如下:packageserver;importjava.net.MalformedURLException;importjava.rmi.AlreadyBoundException;importjava.rmi.Naming;importjava.rmi.RemoteException;importjava.rmi.registry.LocateRegistry;importtranslatorInterface.TranslatorIn;/****@author苑仁群**/publicclassServer{publicstaticvoidmain(Stringarg[])throwsMalformedURLException,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(){@OverridepublicvoidmouseClicked(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.启动服务器后,客户端的运行界面如下: