`
booby325
  • 浏览: 386497 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java实现RMI 的远程调用

 
阅读更多

这次是用java实现RMI 的远程调用:

编写的过程大致为:

1.      首先我们的启动Mysqlserver ,然后再里面建立一个数据库,以便我们在数据库中插入存放学生信息等。

2.      先编写一个接口DataServer,并且继承Remote类,然后再接口里面写上服务器端能实现的方法,然后再定义一个类DataServerImpl 继承UnicastRemoteObject 在实现接口DataServer,并且一一实现它定义在借口里面得到方法,这里我们重新写了一个类DBManager,用来实现与数据库的连接,包括插入数据,根据学号、姓名等进行查询等操作,其源代码见附件。

3.      下面就是需要使用rmic命令进行编译DataServerImpl文件,并且产生两个文件,产生这两个文件后就可以编写服务器端的代码了,主要是在主函数中生成一个DataServerImpl对象,然后在绑定一个端口在程序中,在绑定一个url地址,来绑定服务的对象,这样服务器端的程序就写好了。

4.      下面就是写客户端的代码了。

5.      首先是通过Naming.lookup(url),(url)就是服务器端指定的url地址这样就可以得到一个DataServer的对象,然后得到这样一个对象后就可以调用它的方法了。这样也就实现了调用远程服务器端的代码了,所以说这样RMI就比本上写完了。


 

首先是编写远程的接口调用函数:

 

  1. <span style="font-size:16px;">import java.rmi.Remote;  
  2. import java.rmi.RemoteException;  
  3.   
  4. public interface DataServer extends Remote {  
  5.     public void CreateTable() throws RemoteException;  
  6.     public void insert(int id ,String name,double Score) throws RemoteException;  
  7.     public double select(int id)throws RemoteException;  
  8.     public double select (String name)throws RemoteException;  
  9. }  
  10. </span>  

由于代码中使用到了与数据库的连接,所以写了一个数据库的管理类,代码如下:

 

 

  1. <span style="font-size:16px;">import java.sql.Connection;  
  2. import java.sql.DriverManager;  
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5.   
  6. public class DBManager {  
  7.     private static String user = "root";  
  8.     private static String pass = "123456";  
  9.     private static String className ="com.mysql.jdbc.Driver";  
  10.     private static String url = "jdbc:mysql://localhost:3306/students";  
  11.     private static Connection conn;  
  12.     private static java.sql.Statement state;  
  13.     public static void init()  
  14.     {  
  15.         try {  
  16.             Class.forName(className);  
  17.              conn = DriverManager.getConnection(url,user,pass);  
  18.              state =conn.createStatement();  
  19.                
  20.                
  21.         } catch (ClassNotFoundException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         } catch (SQLException e) {  
  25.             // TODO Auto-generated catch block  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  
  29.     public static  void CreateTable(){  
  30.         String sql = "create table student (id int Primary key, name char (20),score double);";  
  31.         try {  
  32.             state.execute(sql);  
  33.       
  34.         } catch (SQLException e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38.     public static void insert(int id,String name,double score)  
  39.     {  
  40.         String sql = "insert into student values("+id+",'"+name+"',"+score+");";  
  41.         try {  
  42.             state.execute(sql);  
  43.               
  44.         } catch (SQLException e) {  
  45.             // TODO Auto-generated catch block  
  46.             e.printStackTrace();  
  47.         }  
  48.     }  
  49.     public static double select(int id)  
  50.     {  
  51.         String sql  = "select score from student where id = "+id+";";  
  52.         double result= 0;  
  53.         try {  
  54.             ResultSet rs = state.executeQuery(sql);  
  55.             while(rs.next())  
  56.             {  
  57.                  result = rs.getDouble("score");  
  58.             }  
  59.               
  60.         } catch (SQLException e) {  
  61.             // TODO Auto-generated catch block  
  62.             e.printStackTrace();  
  63.         }  
  64.         return result;  
  65.     }  
  66.       
  67.     public static double select(String name)  
  68.     {  
  69.         String sql  = "select score from student where name = '"+name+"';";  
  70.         double result= 0;  
  71.         try {  
  72.             ResultSet rs = state.executeQuery(sql);  
  73.             while(rs.next())  
  74.             {  
  75.                  result = rs.getDouble("score");  
  76.             }  
  77.           
  78.         } catch (SQLException e) {  
  79.             // TODO Auto-generated catch block  
  80.             e.printStackTrace();  
  81.         }  
  82.         return result;  
  83.     }  
  84. }  
  85. </span>  


 

下面就是编写实现类,要继承UnicastRemoteObject,并且实现上面定义的接口。

 

  1. <span style="font-size:16px;">import java.rmi.RemoteException;  
  2. import java.rmi.server.UnicastRemoteObject;  
  3.   
  4.   
  5. public class DataServerImpl extends UnicastRemoteObject implements DataServer {  
  6.   
  7.     static  {  
  8.         DBManager.init();  
  9.     }  
  10.     public DataServerImpl() throws RemoteException {  
  11.         super();  
  12.           
  13.         // TODO Auto-generated constructor stub  
  14.     }  
  15.       
  16.     @Override  
  17.     public void CreateTable() throws RemoteException {  
  18.         DBManager.CreateTable();  
  19.     }  
  20.   
  21.     @Override  
  22.     public void insert(int id, String name, double score)  
  23.             throws RemoteException {  
  24.         DBManager.insert(id, name, score);  
  25.     }  
  26.   
  27.     @Override  
  28.     public double select(int id) throws RemoteException {  
  29.         // TODO Auto-generated method stub  
  30.         double score = DBManager.select(id);  
  31.         return score;  
  32.     }  
  33.   
  34.     @Override  
  35.     public double select(String name) throws RemoteException {  
  36.         double score = DBManager.select(name);  
  37.         return score;  
  38.     }  
  39.   
  40. }  
  41. </span>  

这样就基本上完成了,然后就是编写服务端的代码:

 

 

  1. <span style="font-size:16px;">import java.net.MalformedURLException;  
  2. import java.rmi.Naming;  
  3. import java.rmi.RemoteException;  
  4. import java.rmi.registry.LocateRegistry;  
  5.   
  6. public class RMIServer {  
  7.   
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             DataServerImpl dataServer = new DataServerImpl();  
  11.             LocateRegistry.createRegistry(1111);   //这里,服务端口号可任意指定  
  12.               
  13.             Naming.rebind("//localhost:1111/showScore", dataServer);  
  14.             System.out.println("服务已经启动。。");  
  15.               
  16.         } catch (RemoteException e) {  
  17.             // TODO Auto-generated catch block  
  18.             e.printStackTrace();  
  19.         } catch (MalformedURLException e) {  
  20.             // TODO Auto-generated catch block  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  
  24.   
  25. }  
  26. </span>  

使用命令空间绑定服务的地址,以及服务的名称,以便客户端实现远程调用。客户端的代码如下:

 

 

  1. <span style="font-size:16px;">import java.net.MalformedURLException;  
  2. import java.rmi.Naming;  
  3. import java.rmi.NotBoundException;  
  4. import java.rmi.RemoteException;  
  5. import java.util.Scanner;  
  6.   
  7.   
  8. public class RMIClient {  
  9.     public static void main(String[] args) {  
  10.         Scanner sc = new Scanner(System.in);  
  11.         try {  
  12.             DataServer dataServer = (DataServer)Naming.lookup("//localhost:1111/showScore");  
  13.             System.out.println("首先创建一个数据表,student");  
  14.             dataServer.CreateTable();  
  15.             System.out.println("创建成功。。");  
  16.             boolean isrunning = true;  
  17.             while(isrunning)  
  18.             {  
  19.                 System.out.println("请您按照数字选择操作。\n1.插入数据   2.按学号查找    3.按姓名查找   0.退出");  
  20.                 int select = sc.nextInt();  
  21.                 if(select == 1)  
  22.                 {  
  23.                     System.out.println("请您依次输入学生的学号、姓名、成绩:");  
  24.                     int num = sc.nextInt();  
  25.                     String name = sc.next();  
  26.                     double score = sc.nextDouble();  
  27.                     dataServer.insert(num, name, score);  
  28.                 }  
  29.                 else if(select == 2)  
  30.                 {  
  31.                     System.out.println("请您输入学生的学号:");  
  32.                     int num = sc.nextInt();  
  33.                     double score = dataServer.select(num);  
  34.                     System.out.println("学号: "+num +"   成绩为: "+ score);  
  35.                 }  
  36.                 else if(select == 3)  
  37.                 {  
  38.                     System.out.println("请您输入学生的姓名:");  
  39.                     String name  = sc.next();  
  40.                     double score = dataServer.select(name);  
  41.                     System.out.println("姓名:  "+name +"   成绩为: "+ score);  
  42.                 }  
  43.                 else if(select == 0)  
  44.                 {  
  45.                     isrunning = false;  
  46.                 }  
  47.                 else   
  48.                 {  
  49.                     System.out.println("输入有误,请您重新输入!");  
  50.                 }  
  51.             }  
  52.         } catch (MalformedURLException e) {  
  53.             // TODO Auto-generated catch block  
  54.             e.printStackTrace();  
  55.         } catch (RemoteException e) {  
  56.             // TODO Auto-generated catch block  
  57.             e.printStackTrace();  
  58.         } catch (NotBoundException e) {  
  59.             // TODO Auto-generated catch block  
  60.             e.printStackTrace();  
  61.         }  
  62.   
  63.     }  
  64.   
  65. }  
  66. </span>  

这样就基本上的完成了所有的工作。。。
分享到:
评论

相关推荐

    java 实现RMI远程调用

    实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    通过Java RMI实现远程调用的一个简单例子

    这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    java rmi远程方法调用 客户端

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...

    RMI远程调用代码及使用方法

    ### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...

    JAVA RMI远程调用方法代码

    接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...

    Java RMI远程方法调用详解-例子代码

    首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...

    RMI实现的远程调用

    远程接口中的方法声明了远程调用的行为,但不包含方法的实现。 2. **远程对象(Remote Object)**:实现了远程接口的具体类实例,它是实际提供服务的对象。远程对象通过Java序列化机制被编码为字节流,然后在网络上...

    Java RMI 远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...

    Java RMI(远程方法调用)Demo

    Java RMI,全称为Remote Method Invocation,是Java平台上的一个核心特性,用于实现分布式计算。它允许Java对象在不同的JVM之间进行通信,仿佛这些对象都在同一台机器上一样。这个技术尤其适用于构建大规模的、分散...

    RMI远程调用

    总结来说,RMI远程调用是Java实现分布式计算的关键技术,它通过简化网络编程,使开发者能专注于业务逻辑,而非底层通信细节。结合Spring框架,可以进一步提升RMI应用的开发效率和可维护性。在实际项目中,合理利用...

    java rmi 远程方法调用 服务端

    1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...

    动态代理与RMI远程调用

    在提供的`动态代理与RMI远程调用.ppt`中,可能会详细解释这两个概念,通过PPT的讲解和实例,可以更直观地理解动态代理和RMI的工作原理。同时,`src`目录下的源码文件则提供了具体的实现示例,读者可以通过阅读代码,...

    rmi远程调用读取文件

    在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的程序能够请求另一个JVM上的程序读取并返回文件内容。这种方式在分布式系统中非常常见,可以用于数据共享、文件服务等应用。 RMI的基本...

    Java RMI 远程调用实例.rar

    Java RMI 远程调用实例,各个文件的作用:  DISPLAYPERFECTTIME.JAVA|:向rmiregistry查找PerfectTime对象,定义调用远程对象的方法。  PERFECTTIME.JAVA:向RMI注册服务,以便客户端查找,创建提供注册服务的本地...

    使用rmi进行远程调用

    在这个“使用rmi进行远程调用”的示例中,我们看到的是一个基于RMI实现的银行系统。这个小例子旨在帮助开发者理解如何使用RMI来构建分布式应用程序,尤其是在处理跨网络的远程对象交互时。 首先,RMI的核心概念是...

    rmi 远程调用 实现客户端之间会话

    标题中的“rmi 远程调用 实现客户端之间会话”指的是利用RMI技术让多个客户端与同一服务端建立会话,进行交互。这通常涉及到以下几个核心概念: 1. **远程接口**:这是定义了可以远程调用的方法的接口。远程接口...

    Java RMI远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...

    RMI远程方法调用RMI远程方法调用

    RMI远程方法调用是Java平台上的一个关键特性,它允许Java对象在不同的JVM之间进行通信,从而实现分布式计算。RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 *...

Global site tag (gtag.js) - Google Analytics