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

这个范例是基于JDK1.5的RMI程序搭建。
主要将服务器端和客户端分布在两个独立的项目工程中,以实现客户端传递参数到服务器端,服务器端返回查询结果的过程。

1.在Eclipse里面创建一个server 端的project。然后创建一个接口(IRemote),这个接口是你要向client端开放的方法定义。 里面开放一个通过参数返回结果的方法。并且这个接口继承java.rmi.Remote接口。
package rmi.server.remote;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IRemote extends Remote {

	public String querySQL(String userId) throws RemoteException;

}

2.创建上述接口(IRemote)的实现类(RemoteImpl)。
package rmi.server.remote;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class RemoteImpl implements IRemote {

	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)))";
	private final static String USERNAME = "DBUSER";
	private final static String PASSWORD = "DBPASSWORD	";

	public RemoteImpl() throws RemoteException {
	}

	public String querySQL(String userId) throws RemoteException {
		StringBuffer sb = new StringBuffer();

		Connection connection = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

			String query = "select * from u_user where user_id = '" + userId + "'";
			Statement statement = connection.createStatement();
			ResultSet rs = statement.executeQuery(query);

			while (rs.next()) {
				sb.append(" | user id:");
				sb.append(rs.getString("USER_ID"));
				sb.append(" | nick name:");
				sb.append(rs.getString("USER_NICK_NAME"));
				sb.append(" | password:");
				sb.append(rs.getString("USER_PASSWORD"));
				sb.append("\r\n");
			}
			rs.close();
			statement.close();
			connection.close();
		} catch (Exception e) {
			try {
				if (connection != null) {
					connection.close();
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}

		return sb.toString();
	}
}

3. 定义一个服务器端主程序入口,注册你已经实现的RMI接口,包括开放端口等。
package rmi.server;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import rmi.server.remote.IRemote;
import rmi.server.remote.RemoteImpl;


public class Server {

	public static void main(String[] args) throws AlreadyBoundException,
			RemoteException {

		RemoteImpl remoteObj = new RemoteImpl();
		
		IRemote userManager = (IRemote) UnicastRemoteObject.exportObject(remoteObj, 0);
		
		// Bind the remote object in the registry
		Registry registry = LocateRegistry.createRegistry(2001);
		registry.rebind("userManager", userManager);
		
		System.out.println("server is ready");
	}
}

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


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

6.导入接口jar以后,可以开始编写一个client端的主程序,并调用server端的方法。
package rmi.client;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import rmi.server.remote.IRemote;

public class Client {

	public static void main(String[] args) {
		try {
			Registry registry = LocateRegistry.getRegistry("localhost", 2001);

			IRemote userManager = (IRemote) registry.lookup("userManager");

			
			String strResult = userManager.querySQL("EU0000000095");
			System.out.println(strResult);

			strResult = userManager.querySQL("EU0000000168");
			System.out.println(strResult);

			strResult = userManager.querySQL("EU0000000169");
			System.out.println(strResult);
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}

	}
}


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值