JAVA-RMI-对计算器编程实现_第1页
JAVA-RMI-对计算器编程实现_第2页
JAVA-RMI-对计算器编程实现_第3页
JAVA-RMI-对计算器编程实现_第4页
JAVA-RMI-对计算器编程实现_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上JAVA RMI 对计算器编程实现摘要:本文围绕Java编程语言在网络编程方面的具体应用,论述了面向对象方法,对计算器程序进行需求分析、概要设计、详细设计,最后使用java rmi编程实现了全过程。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。RMI目前使

2、用Java远程消息交换协议JRMP(Java Remote Messaging otocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。本文拟从程序的角度举例介绍怎样利用RMI实现Java分布式应用。 关键词:JAVA RMI 分布式 应用Abstract : This pap

3、er focuses on the specific application in the Java programming language network programming , discusses the object-oriented method, the calculator program needs analysis , outline design , detailed design , and finally the use of java rmi programming the entire process. As a rage Java web developmen

4、t language, and its enormous power is reflected in the ability of its powerful development of distributed network applications , while the core 100% pure Java RMI is to develop a network of distributed application system one of the solutions . In fact, it can be seen as RPC Java version. But traditi

5、onal RPC is not well applied to distributed object systems . The Java RMI supports communication between the stored procedures in different address spaces each object class , seamless remote call remote objects. Currently the use of Java RMI remote message exchange protocol JRMP (Java Remote Messagi

6、ng PRotocol) communication. JRMP is a protocol designed for Java remote object making. Thus , the advantages of "Write Once, Run Anywhere" The Java RMI with Java , and is 100% pure Java distributed application system solutions. Applications developed using Java RMI systems can be deployed

7、on any platform supported JRE (Java Run Environment Java, Runtime Environment) . This paper , for example from the perspective of how to introduce the use of the program 's implementation of Java RMI distributed applications .Keywords: JAVA RMI Distributed Application 1引言随着科学技术的发展,计算机领域也在飞速的发展,人

8、们对于计算器的要求越来越高。而java语言是今年来比较流行的语言。经过10多年的发展,java已经渗透到全球的每个角落。而在这个网络时代,java语言在网络编程方面的有事使得网络编程有了更好的选择。Java语言最令人瞩目的特点就是其具有跨平台性,使其不受平台影响,并得到了广泛的应用。1.1 RMI系统运行机理RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户机进行通信和信息传递

9、提供了一种机制。在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:(1) 初始化与包含远程对象的远程虚拟机的连接;(2) 对远程虚拟机的参数进行编组(写入并传输);(3) 等待方法调用结果;(4) 解编(读取)返回值或返回的异常;(5) 将值返回给调用程序。为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节

10、隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:(1) 解编(读取)远程方法的参数;(2) 调用实际远程对象实现上的方法;(3) 将结果(返回值或异常)编组(写入并传输)给调用程序。stub和skeleton由rmic编译器生成。利用RMI编写分布式对象应用程序需要完成以下工作2:(1) 定位远程对象。应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引

11、用作为常规操作的一部分来进行传递和返回。(2)与远程对象通信。远程对象间通信的细节由RMI处理,对于程序员来说,远程通信看起来就像标准的Java方法调用。(3)给作为参数或返回值传递的对象加载类字节码。因为RMI答应调用程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。1.2 对象序列化在RMI分布式应用系统中,服务器与客户机之间传递的Java对象必须是可序列化的对象。不可序列化的

12、对象不能在对象流中进行传递。对象序列化扩展了核心Java输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。序列化用于轻型持久性和借助于套接字或远程方法调用(RMI)进行的通信。序列化中现在包括一个 API( Programming Interface,应用程序接口),答应独立于类的域指定对象的序列化数据,并答应使用现有协议将序列化数据域写入流中或从流中读取,以确保与缺省读写机制的兼容性。为编写应用程序,除多数瞬态应用程序外,都必须具备存储和检索 Java对象的能力。以序列化方式存储和检索对象的要害

13、在于提供重新构造该对象所需的足够对象状态。存储到流的对象可能会支持 Serializable(可序列化)或 Externalizable(可外部化)接口。对于Java对象,序列化形式必须能标识和校验存储其内容的对象所属的 Java类,并且将该内容还原为新的实例。对于可序列化对象,流将提供足够的信息将流的域还原为类的兼容版本。对于可外部化对象,类将全权负责其内容的外部格式。序列化 Java 对象的目的是:提供一种简单但可扩充的机制,以序列化方式维护 Java对象的类型及安全属性;具有支持编组和解编的扩展能力以满足远程对象的需要;具有可扩展性以支持 Java 对象的简单持久性;只有在自定义时,才需

14、对每个类提供序列化自实现;答应对象定义其外部格式。2 分布式应用的实现和运行步骤2.1 编写Java RMI分布式应用程序的步骤主要包括以下几步:将远程类的功能定义为Java接口。在Java中,远程对象是实现远程接口的类的实例1。在远程接口中声明每个要远程调用的方法。远程接口具有如下特点:1) 远程接口必须声明为public。假如不这样,则除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时会得到错误结果。2) 远程对象扩展java.rmi.Remote接口。3) 除了所有应用程序特定的例外之外,每个方法还必须抛出java.rmi.RemoteException例外。4)

15、 任何作为参数或返回值传送的远程对象的数据类型必须声明为远程接口类型,而不是实现类。2.2 系统功能图图 2.2 计算器系统功能图3 程序设计说明下面是一个使用RMI实现的计算器,主要分为两个部分,服务器主要实现接受客服端的连接并进行加、减、乘、除,最后将结果返回给客户端,客户端主要实现对计算器的GUI编程,添加事件监听,对用户进行的操作进行判断,并调用客服端的方法进行计算。下面对结果和程序进行分析:定义一个接口并从实现Remate接口定义一个CalculatorImp类实现Calculator这个接口,并重写接口的方法服务端进行注册客户端进行远程方法调用运行结果如下:启动服务端启动客户端:参

16、考文献:1 编程思想 Thinking in Java 4th Bruce Eckel著 北京;机械工业出版社,20072 分布式操作系统 Andrew S.Tanenbaum著 北京;电子工业出版社,2008附源代码:package com.cqupt.RMI;import java.rmi.Remote;public interface Calculator extends Remote /J2SE的API中Remote确实是个接口,/只有实现了remote接口的方法才可以被远程调用Public double add(double a,double b)throws java.rmi.Re

17、moteException;public double sub(double a,double b)throws java.rmi.RemoteException;public double mul(double a,double b)throws java.rmi.RemoteException;public double div(double a,double b)throws java.rmi.RemoteException;package com.cqupt.RMI;import java.rmi.RemoteException;import java.rmi.server.Unica

18、stRemoteObject;public class CalculatorImp extends UnicastRemoteObject implements Calculator CalculatorImp() throws RemoteExceptionsuper();public double add(double a, double b) throws java.rmi.RemoteException / TODO Auto-generated method stubSystem.out.println("RMI调用服务端所得结果:" + a + " +

19、 " + b + "=" + (a + b);return a + b;public double div(double a, double b) throws java.rmi.RemoteException / TODO Auto-generated method stubSystem.out.println("RMI调用服务端所得结果:" + a + " / " + b + "=" + (a / b);return a / b;public double mul(double a, double b

20、 )throws java.rmi.RemoteException / TODO Auto-generated method stubSystem.out.println("RMI调用服务端所得结果:" + a + " * " + b + "=" + (a * b);return a * b;public double sub(double a, double b) throws java.rmi.RemoteException / TODO Auto-generated method stubSystem.out.println(&

21、quot;RMI调用服务端所得结果:" + a + " - " + b + "=" + (a - b);return a - b;package com.cqupt.RMI;import .MalformedURLException;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;public class CaculatorServer CaculatorServer()try Calculator c

22、= new CalculatorImp();LocateRegistry.createRegistry(3000);/使用一个新的端口,默认端口是1109Naming.rebind("rmi:/localhost:3000/CaculatorServer", c); /将server注册System.out.println("服务器注册成功"); catch (RemoteException e) e.printStackTrace(); catch (MalformedURLException e1)e1.printStackTrace();publi

23、c static void main(String args)new CaculatorServer();package com.cqupt.RMI;import .MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;public class CalculatorCli

24、ent extends JFrame private String front = "", behind = "" /分别用于记录加减乘除运算符之前,之后输入的内容 private String op; /用于记录运算符 private String re;/用于存储运算结果的字符串格式 private boolean flag = false; /用于记录是否按下了运算符 private boolean flag1 = false;/用于判断是否输入了点运算符 private double result;/用于存储运算结果 private boolea

25、n flag2 = false;/用于判断是否输入了数字 private boolean flag3 = false;/用于判断是否按下了等号运算符 JPanel contentPane; JTextField txtResult = new JTextField("0"); JButton btnNull = new JButton("sqrt"); JButton btnFour = new JButton("4"); JButton btnFive = new JButton("5"); JButton bt

26、nSix = new JButton("6"); JButton btnDecrease = new JButton("-"); JButton btnBegin = new JButton("C"); JButton btnOne = new JButton("1"); JButton btnTwo = new JButton("2"); JButton btnThree = new JButton("3"); JButton btnMultiply = new JButt

27、on("*"); JButton btnCancel = new JButton(""); JButton btnZero = new JButton("0"); JButton btnMinus = new JButton("+/-"); JButton btnPoint = new JButton("."); JButton btnDivide = new JButton("/"); JButton btnEqual = new JButton("="

28、); JButton btnIncrease = new JButton("+"); JButton btnSeven = new JButton("7"); JButton btnEight = new JButton("8"); JButton btnNine = new JButton("9"); public CalculatorClient() try setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit(); catch (Exception exception

29、) exception.printStackTrace(); private void jbInit() throws Exception contentPane = (JPanel) getContentPane(); contentPane.setLayout(null); this.setResizable(false); setSize(new Dimension(400, 300); setTitle("计算器"); txtResult.setEnabled(false); txtResult.setFont(new java.awt.Font("Dia

30、log", Font.PLAIN, 20); txtResult.setEditable(false); txtResult.setHorizontalAlignment(SwingConstants.RIGHT); txtResult.setBounds(new Rectangle(33, 19, 310, 34); btnNull.setBounds(new Rectangle(298, 70, 46, 37); btnNull.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12); /btnNull.addA

31、ctionListener(new FrameCalculate_btnNull_actionAdapter(this); btnFour.setBounds(new Rectangle(33, 120, 46, 37); btnFour.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnFive.setBounds(new Rectangle(101, 120, 46, 37); btnFive.setFont(new java.awt.Font("Dialog", Font.PLAIN,

32、20); btnSix.setBounds(new Rectangle(167, 119, 46, 37); btnSix.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnDecrease.setBounds(new Rectangle(234, 120, 46, 37); btnDecrease.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnBegin.setBounds(new Rectangle(298, 121, 46

33、, 37); btnBegin.setFont(new java.awt.Font("Dialog", Font.PLAIN, 15); btnBegin.addActionListener(new Calculate_btnBegin_actionAdapter(this); btnOne.setBounds(new Rectangle(33, 172, 46, 37); btnOne.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnTwo.setBounds(new Rectangle(

34、101, 172, 46, 37); btnTwo.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnThree.setBounds(new Rectangle(167, 172, 46, 37); btnThree.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnMultiply.setBounds(new Rectangle(234, 172, 46, 37); btnMultiply.setFont(new java.awt

35、.Font("Dialog", Font.PLAIN, 20); btnCancel.setBounds(new Rectangle(298, 172, 46, 37); btnCancel.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12); btnCancel.addActionListener(new Calculate_btnCancel_actionAdapter(this); btnZero.setBounds(new Rectangle(33, 222, 46, 37); btnZero.

36、setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); /加载数字0-9的监听事件 btnZero.addActionListener(new Calculate_btnZero_actionAdapter(this); btnOne.addActionListener(new Calculate_btnZero_actionAdapter(this); btnTwo.addActionListener(new Calculate_btnZero_actionAdapter(this); btnThree.addAction

37、Listener(new Calculate_btnZero_actionAdapter(this); btnFour.addActionListener(new Calculate_btnZero_actionAdapter(this); btnFive.addActionListener(new Calculate_btnZero_actionAdapter(this); btnSix.addActionListener(new Calculate_btnZero_actionAdapter(this); btnSeven.addActionListener(new Calculate_b

38、tnZero_actionAdapter(this); btnEight.addActionListener(new Calculate_btnZero_actionAdapter(this); btnNine.addActionListener(new Calculate_btnZero_actionAdapter(this); btnMinus.setBounds(new Rectangle(101, 222, 46, 37); btnMinus.setFont(new java.awt.Font("Dialog", Font.PLAIN, 10); btnMinus.

39、addActionListener(new Calculate_btnMinus_actionAdapter(this); btnPoint.setBounds(new Rectangle(167, 222, 46, 37); btnPoint.setFont(new java.awt.Font("Dialog", Font.PLAIN, 30); btnPoint.setHorizontalTextPosition(SwingConstants.CENTER); btnPoint.addActionListener(new Calculate_btnPoint_actio

40、nAdapter(this); btnDivide.setBounds(new Rectangle(234, 222, 46, 37); btnDivide.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnEqual.setBounds(new Rectangle(298, 222, 46, 37); btnEqual.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnEqual.addActionListener(new Cal

41、culate_btnEqual_actionAdapter(this); btnIncrease.setBounds(new Rectangle(234, 70, 46, 37); btnIncrease.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); /加载加减乘除运算符的监听事件 btnIncrease.addActionListener(new Calculate_btnIncrease_actionAdapter(this); btnDecrease.addActionListener(new Calcula

42、te_btnIncrease_actionAdapter(this); btnMultiply.addActionListener(new Calculate_btnIncrease_actionAdapter(this); btnDivide.addActionListener(new Calculate_btnIncrease_actionAdapter(this); btnSeven.setBounds(new Rectangle(33, 70, 46, 37); btnSeven.setFont(new java.awt.Font("Dialog", Font.PL

43、AIN, 20); btnEight.setBounds(new Rectangle(101, 70, 46, 37); btnEight.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); btnNine.setBounds(new Rectangle(167, 70, 46, 37); btnNine.setFont(new java.awt.Font("Dialog", Font.PLAIN, 20); contentPane.add(btnFive); contentPane.add(btnS

44、ix); contentPane.add(btnDecrease); contentPane.add(btnBegin); contentPane.add(btnOne); contentPane.add(btnTwo); contentPane.add(btnThree); contentPane.add(btnMultiply); contentPane.add(btnCancel); contentPane.add(btnMinus); contentPane.add(btnPoint); contentPane.add(btnDivide); contentPane.add(btnEq

45、ual); contentPane.add(btnEight); contentPane.add(btnNine); contentPane.add(btnFour); contentPane.add(btnSeven); contentPane.add(btnIncrease); contentPane.add(btnNull); contentPane.add(txtResult); contentPane.add(btnZero); public void btnZero_actionPerformed(ActionEvent e) if (flag) /如果刚刚按下了运算符 txtRe

46、sult.setText(""); if (flag1) /判断之前是否输入了点运算符 txtResult.setText("0." + e.getActionCommand(); flag1 = false; else txtResult.setText(e.getActionCommand(); flag2 = true; else int num = txtResult.getText().indexOf("."); if (num < 0 && !txtResult.getText().equals(&q

47、uot;0") txtResult.setText(txtResult.getText() + e.getActionCommand(); else if (num < 0 && txtResult.getText().equals("0") txtResult.setText(e.getActionCommand(); else if (num >= 0 && txtResult.getText().equals("0") txtResult.setText("0." + e.g

48、etActionCommand(); else if (num >= 0 && !txtResult.getText().equals("0") txtResult.setText(txtResult.getText() + e.getActionCommand(); flag = false; flag3=false; public void btnIncrease_actionPerformed(ActionEvent e) if(flag3) txtResult.setText(txtResult.getText(); op = e.getAct

49、ionCommand(); /得到刚刚按下的运算符 front = txtResult.getText(); /记录加减乘除运算符之前输入的内容 else if (flag2) ActionEvent ee = new ActionEvent("qq", 1, "pp"); btnEqual_actionPerformed(ee); op = e.getActionCommand(); /得到刚刚按下的运算符 front = re; flag2 = false; else front = txtResult.getText(); /记录加减乘除运算符之前

50、输入的内容 op = e.getActionCommand(); /得到刚刚按下的运算符 flag3=false; flag = true; /记录已经按下了加减乘除运算符的其中一个 public void btnEqual_actionPerformed(ActionEvent e) if(!flag3)/未曾按下等于运算符 behind = txtResult.getText(); else front = re; try double a1 = Double.parseDouble(front); double b1 = Double.parseDouble(behind); if (o

51、p = "+") result = this.invoke(a1, b1, "+"); else if (op = "-") result = this.invoke(a1, b1, "-"); else if (op = "*") result = this.invoke(a1, b1, "*"); else result = this.invoke(a1, b1, "/"); Double r = new Double(result); re = r.

52、toString(result); txtResult.setText(re); catch (ArithmeticException ce) txtResult.setText("除数不能为零"); catch (Exception ee) if (!flag3) flag3 = true; public double invoke(double a1,double b1,String symbol)double result = 0;try Calculator c = (Calculator)Naming.lookup("rmi:/localhost:3000/CaculatorServer");/Naming.lookup will retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论