JavaRMI远程调用

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

创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的10多年时间我们累计服务了上千家以及全国政企客户,如成都汽车玻璃修复等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致表扬。

编写的过程大致为:

  1. 首先我们的启动Mysqlserver ,然后再里面建立一个数据库,以便我们在数据库中插入存放学生信息等。
  2. 先编写一个接口DataServer,并且继承Remote类,然后再接口里面写上服务器端能实现的方法,然后再定义一个类DataServerImpl 继承UnicastRemoteObject 在实现接口DataServer,并且一一实现它定义在借口里面得到方法,这里我们重新写了一个类DBManager,用来实现与数据库的连接,包括插入数据,根据学号、姓名等进行查询等操作,其源代码见附件。
  3. 下面就是需要使用rmic命令进行编译DataServerImpl文件,并且产生两个文件,产生这两个文件后就可以编写服务器端的代码了,主要是在主函数中生成一个DataServerImpl对象,然后在绑定一个端口在程序中,在绑定一个url地址,来绑定服务的对象,这样服务器端的程序就写好了。
  4. 下面就是写客户端的代码了。
  5. 首先是通过Naming.lookup(url),(url)就是服务器端指定的url地址这样就可以得到一个DataServer的对象,然后得到这样一个对象后就可以调用它的方法了。这样也就实现了调用远程服务器端的代码了,所以说这样RMI就比本上写完了。

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

 
 
 
  1. import java.rmi.Remote;
  2. import java.rmi.RemoteException;
  3. public interface DataServer extends Remote {
  4.     public void CreateTable() throws RemoteException;
  5.     public void insert(int id ,String name,double Score) throws RemoteException;
  6.     public double select(int id)throws RemoteException;
  7.     public double select (String name)throws RemoteException;
  8. }

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

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

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

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

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

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

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

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

这样就基本上的完成了所有的工作。。。

新闻名称:JavaRMI远程调用
网页URL:http://www.csdahua.cn/qtweb/news42/38542.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网