Java的RMI(远程方法调用)的实现范例

来源:互联网 发布:网络游戏数据能修改吗 编辑:程序博客网 时间:2024/05/19 23:12

Java的RMI(远程方法调用)的实现范例

738人阅读 评论(0)收藏举报
分类:
这个范例是基于JDK1.5的RMI程序搭建。
主要将服务器端和客户端分布在两个独立的项目工程中,以实现客户端传递参数到服务器端,服务器端返回查询结果的过程。

1.在Eclipse里面创建一个server 端的project。然后创建一个接口(IRemote),这个接口是你要向client端开放的方法定义。 里面开放一个通过参数返回结果的方法。并且这个接口继承java.rmi.Remote接口。
[java] view plain copy print?
  1. package rmi.server.remote;  
  2.   
  3. import java.rmi.Remote;  
  4. import java.rmi.RemoteException;  
  5.   
  6. public interface IRemote extends Remote {  
  7.   
  8.     public String querySQL(String userId) throws RemoteException;  
  9.   
  10. }  

2.创建上述接口(IRemote)的实现类(RemoteImpl)。
[java] view plain copy print?
  1. package rmi.server.remote;  
  2.   
  3. import java.rmi.RemoteException;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9.   
  10. public class RemoteImpl implements IRemote {  
  11.   
  12.     private final static String URL = "jdbc:oracle:thin:@(description=(address_list=(address=(host=192.168.0.80)(protocol=tcp)(port=1521))(load_balance=yes)(failover=on))(connect_data=(service_name=mgdb01)))";  
  13.     private final static String USERNAME = "DBUSER";  
  14.     private final static String PASSWORD = "DBPASSWORD  ";  
  15.   
  16.     public RemoteImpl() throws RemoteException {  
  17.     }  
  18.   
  19.     public String querySQL(String userId) throws RemoteException {  
  20.         StringBuffer sb = new StringBuffer();  
  21.   
  22.         Connection connection = null;  
  23.         try {  
  24.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  25.             connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);  
  26.   
  27.             String query = "select * from u_user where user_id = '" + userId + "'";  
  28.             Statement statement = connection.createStatement();  
  29.             ResultSet rs = statement.executeQuery(query);  
  30.   
  31.             while (rs.next()) {  
  32.                 sb.append(" | user id:");  
  33.                 sb.append(rs.getString("USER_ID"));  
  34.                 sb.append(" | nick name:");  
  35.                 sb.append(rs.getString("USER_NICK_NAME"));  
  36.                 sb.append(" | password:");  
  37.                 sb.append(rs.getString("USER_PASSWORD"));  
  38.                 sb.append("\r\n");  
  39.             }  
  40.             rs.close();  
  41.             statement.close();  
  42.             connection.close();  
  43.         } catch (Exception e) {  
  44.             try {  
  45.                 if (connection != null) {  
  46.                     connection.close();  
  47.                 }  
  48.             } catch (SQLException e1) {  
  49.                 e1.printStackTrace();  
  50.             }  
  51.             e.printStackTrace();  
  52.         }  
  53.   
  54.         return sb.toString();  
  55.     }  
  56. }  

3. 定义一个服务器端主程序入口,注册你已经实现的RMI接口,包括开放端口等。
[java] view plain copy print?
  1. package rmi.server;  
  2.   
  3. import java.rmi.AlreadyBoundException;  
  4. import java.rmi.RemoteException;  
  5. import java.rmi.registry.LocateRegistry;  
  6. import java.rmi.registry.Registry;  
  7. import java.rmi.server.UnicastRemoteObject;  
  8.   
  9. import rmi.server.remote.IRemote;  
  10. import rmi.server.remote.RemoteImpl;  
  11.   
  12.   
  13. public class Server {  
  14.   
  15.     public static void main(String[] args) throws AlreadyBoundException,  
  16.             RemoteException {  
  17.   
  18.         RemoteImpl remoteObj = new RemoteImpl();  
  19.           
  20.         IRemote userManager = (IRemote) UnicastRemoteObject.exportObject(remoteObj, 0);  
  21.           
  22.         // Bind the remote object in the registry  
  23.         Registry registry = LocateRegistry.createRegistry(2001);  
  24.         registry.rebind("userManager", userManager);  
  25.           
  26.         System.out.println("server is ready");  
  27.     }  
  28. }  

4.到目前为止,Server端的代码已经全部写完。现在将接口(IRemote)打包成jar,导入到客户端工程中。


5.开始创建client端的程序。新建一个project。创建完成后,把刚才jar包导入进client的项目中。

6.导入接口jar以后,可以开始编写一个client端的主程序,并调用server端的方法。
[java] view plain copy print?
  1. package rmi.client;  
  2.   
  3. import java.rmi.NotBoundException;  
  4. import java.rmi.RemoteException;  
  5. import java.rmi.registry.LocateRegistry;  
  6. import java.rmi.registry.Registry;  
  7.   
  8. import rmi.server.remote.IRemote;  
  9.   
  10. public class Client {  
  11.   
  12.     public static void main(String[] args) {  
  13.         try {  
  14.             Registry registry = LocateRegistry.getRegistry("localhost"2001);  
  15.   
  16.             IRemote userManager = (IRemote) registry.lookup("userManager");  
  17.   
  18.               
  19.             String strResult = userManager.querySQL("EU0000000095");  
  20.             System.out.println(strResult);  
  21.   
  22.             strResult = userManager.querySQL("EU0000000168");  
  23.             System.out.println(strResult);  
  24.   
  25.             strResult = userManager.querySQL("EU0000000169");  
  26.             System.out.println(strResult);  
  27.               
  28.         } catch (RemoteException e) {  
  29.             e.printStackTrace();  
  30.         } catch (NotBoundException e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.   
  34.     }  
  35. }  


7.执行步骤,先执行服务器端程序,然后再执行客户端程序。



0 0
原创粉丝点击