自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java RMI遠(yuǎn)程調(diào)用

開(kāi)發(fā) 后端
對(duì)于用用Java實(shí)現(xiàn)RMI的遠(yuǎn)程調(diào)用,我們可以通過(guò)作者以下的五個(gè)部分來(lái)解決,不適合初學(xué)者。詳細(xì)了解請(qǐng)看下文。

這次是用java實(shí)現(xiàn)RMI 的遠(yuǎn)程調(diào)用:

編寫(xiě)的過(guò)程大致為:

  1. 首先我們的啟動(dòng)Mysqlserver ,然后再里面建立一個(gè)數(shù)據(jù)庫(kù),以便我們?cè)跀?shù)據(jù)庫(kù)中插入存放學(xué)生信息等。
  2. 先編寫(xiě)一個(gè)接口DataServer,并且繼承Remote類,然后再接口里面寫(xiě)上服務(wù)器端能實(shí)現(xiàn)的方法,然后再定義一個(gè)類DataServerImpl 繼承UnicastRemoteObject 在實(shí)現(xiàn)接口DataServer,并且一一實(shí)現(xiàn)它定義在借口里面得到方法,這里我們重新寫(xiě)了一個(gè)類DBManager,用來(lái)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接,包括插入數(shù)據(jù),根據(jù)學(xué)號(hào)、姓名等進(jìn)行查詢等操作,其源代碼見(jiàn)附件。
  3. 下面就是需要使用rmic命令進(jìn)行編譯DataServerImpl文件,并且產(chǎn)生兩個(gè)文件,產(chǎn)生這兩個(gè)文件后就可以編寫(xiě)服務(wù)器端的代碼了,主要是在主函數(shù)中生成一個(gè)DataServerImpl對(duì)象,然后在綁定一個(gè)端口在程序中,在綁定一個(gè)url地址,來(lái)綁定服務(wù)的對(duì)象,這樣服務(wù)器端的程序就寫(xiě)好了。
  4. 下面就是寫(xiě)客戶端的代碼了。
  5. 首先是通過(guò)Naming.lookup(url),(url)就是服務(wù)器端指定的url地址這樣就可以得到一個(gè)DataServer的對(duì)象,然后得到這樣一個(gè)對(duì)象后就可以調(diào)用它的方法了。這樣也就實(shí)現(xiàn)了調(diào)用遠(yuǎn)程服務(wù)器端的代碼了,所以說(shuō)這樣RMI就比本上寫(xiě)完了。

首先是編寫(xiě)遠(yuǎn)程的接口調(diào)用函數(shù):

  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> 

由于代碼中使用到了與數(shù)據(jù)庫(kù)的連接,所以寫(xiě)了一個(gè)數(shù)據(jù)庫(kù)的管理類,代碼如下:

  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> 

下面就是編寫(xiě)實(shí)現(xiàn)類,要繼承UnicastRemoteObject,并且實(shí)現(xiàn)上面定義的接口。

  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> 

這樣就基本上完成了,然后就是編寫(xiě)服務(wù)端的代碼:

  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);   //這里,服務(wù)端口號(hào)可任意指定  
  12.               
  13.             Naming.rebind("//localhost:1111/showScore", dataServer);  
  14.             System.out.println("服務(wù)已經(jīng)啟動(dòng)。。");  
  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> 

使用命令空間綁定服務(wù)的地址,以及服務(wù)的名稱,以便客戶端實(shí)現(xiàn)遠(yuǎn)程調(diào)用??蛻舳说拇a如下:

  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("首先創(chuàng)建一個(gè)數(shù)據(jù)表,student");  
  14.             dataServer.CreateTable();  
  15.             System.out.println("創(chuàng)建成功。。");  
  16.             boolean isrunning = true;  
  17.             while(isrunning)  
  18.             {  
  19.                 System.out.println("請(qǐng)您按照數(shù)字選擇操作。\n1.插入數(shù)據(jù)   2.按學(xué)號(hào)查找    3.按姓名查找   0.退出");  
  20.                 int select = sc.nextInt();  
  21.                 if(select == 1)  
  22.                 {  
  23.                     System.out.println("請(qǐng)您依次輸入學(xué)生的學(xué)號(hào)、姓名、成績(jī):");  
  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("請(qǐng)您輸入學(xué)生的學(xué)號(hào):");  
  32.                     int num = sc.nextInt();  
  33.                     double score = dataServer.select(num);  
  34.                     System.out.println("學(xué)號(hào): "+num +"   成績(jī)?yōu)椋?nbsp;"+ score);  
  35.                 }  
  36.                 else if(select == 3)  
  37.                 {  
  38.                     System.out.println("請(qǐng)您輸入學(xué)生的姓名:");  
  39.                     String name  = sc.next();  
  40.                     double score = dataServer.select(name);  
  41.                     System.out.println("姓名:  "+name +"   成績(jī)?yōu)椋?nbsp;"+ score);  
  42.                 }  
  43.                 else if(select == 0)  
  44.                 {  
  45.                     isrunning = false;  
  46.                 }  
  47.                 else   
  48.                 {  
  49.                     System.out.println("輸入有誤,請(qǐng)您重新輸入!");  
  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> 

這樣就基本上的完成了所有的工作。。。

原文鏈接:http://blog.csdn.net/wx_962464/article/details/7443231

【編輯推薦】

  1. 淺談Java的方法覆蓋與變量覆蓋
  2. Java類變量和成員變量初始化過(guò)程
  3. JavaScript表格組件加載速度測(cè)試
  4. 5個(gè)讓人激動(dòng)的Java項(xiàng)目
  5. Java并行編程:從并行任務(wù)集獲取反饋
責(zé)任編輯:林師授 來(lái)源: wx_962464的博客
相關(guān)推薦

2012-02-07 13:21:37

Java

2019-06-21 14:48:25

RMI遠(yuǎn)程RPC

2018-02-28 14:04:08

RMIJDBC存儲(chǔ)

2021-05-11 00:08:00

JavaRMI 分布式

2011-03-28 10:42:00

Spring

2010-07-19 14:08:15

2022-09-15 07:31:49

Spring攔截器注解

2010-08-25 17:08:18

實(shí)例教程

2013-05-29 09:59:20

Java-RMI遠(yuǎn)程調(diào)用

2016-04-21 10:10:31

Java應(yīng)用架構(gòu)

2009-06-19 14:23:41

RMIJava分布式計(jì)算

2014-09-02 10:43:45

RedisRPC

2024-05-31 08:45:24

2009-06-15 10:00:08

FluorineFx庫(kù)Silverlight

2022-06-04 11:12:12

RPCREST協(xié)議

2018-06-12 15:10:49

RPCRM企業(yè)

2011-12-19 13:29:12

Java

2015-06-09 13:31:29

Hadoop RPC遠(yuǎn)源碼解析

2023-07-13 09:01:39

Bean接口容器

2023-05-18 08:47:42

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)