原文地址:点击打开链接
java创建远程方法调用的步骤如下:
我的例子:
定义供远程调用的接口
实现远程接口,定义服务类
创建服务端应用程序
创建客户端应用程序
运行服务端和客户端测试
运行命令rmic 生产总框架
- 定义一个扩展远程接口(Remote)的接口,这个接口方法将供给客户端调用,该接口中的每个方法都必须声明抛出RemoteException。
- 定义一个实现该接口并扩展了UnicastRemoteObject的类(服务端运行的服务类),这个类将实现给客户端调用的所用方法。
- 创建服务端供客户端调用的应用程序。
- 创建客户端RMI调用服务端的应用程序。
- 启动服务端,再启动客户端,测试是否调用成功。
- 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类路径下
我的例子:
- package com.diaoge.java.rmi.beans;
- import java.io.Serializable;
- public class Employees implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = -8202439972511838105L;
- private String id;
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getId() {
- return id;
- }
- }
定义供远程调用的接口
- package com.diaoge.java.rmi;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- import com.diaoge.java.rmi.beans.Employees;
- public interface RemoteInterface extends Remote{
- public String getServerInfo(int index)throws RemoteException;
- public Employees getEmployeesById(String id)throws RemoteException;
- }
实现远程接口,定义服务类
- package com.diaoge.java.rmi;
- import java.rmi.RemoteException;
- import java.rmi.server.UnicastRemoteObject;
- import com.diaoge.java.rmi.beans.Employees;
- public class RemoteInterfaceImpl extends UnicastRemoteObject implements RemoteInterface{
- /**
- *
- */
- private static final long serialVersionUID = -3491749919079349917L;
- public RemoteInterfaceImpl()throws RemoteException{
- super();
- }
- @Override
- public Employees getEmployeesById(String id) throws RemoteException {
- Employees employees = new Employees();
- employees.setId(id);
- employees.setName("雕戈_"+id);
- return employees;
- }
- @Override
- public String getServerInfo(int index) throws RemoteException {
- if(index==5)
- throw new RemoteException("远程抛出的异常");
- return "远程方法调用RMI测试程序_"+index;
- }
- }
创建服务端应用程序
- package com.diaoge.java.rmi;
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.RemoteException;
- import java.rmi.registry.LocateRegistry;
- public class RmiServer {
- private static final int PORT = 9930;
- public static void main(String[] args) {
- try {
- RemoteInterfaceImpl impl = new RemoteInterfaceImpl();
- LocateRegistry.createRegistry(PORT);
- Naming.rebind("//localhost:"+PORT+"/rmitest", impl);
- System.out.println("RMI的服务端已经启动。。。。。");
- } catch (RemoteException e) {
- e.printStackTrace();
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- }
- }
创建客户端应用程序
- package com.diaoge.java.rmi;
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.NotBoundException;
- import java.rmi.RemoteException;
- import com.diaoge.java.rmi.beans.Employees;
- public class RmiClient {
- public static void main(String[] args) {
- try {
- final RemoteInterface client = (RemoteInterface) Naming.lookup("//192.168.1.101:9930/rmitest");
- new Thread(new Runnable(){
- @Override
- public void run() {
- Employees emp;
- int index = 0;
- try {
- while(true){
- Thread.sleep(1000);
- emp = client.getEmployeesById(""+(index++));
- System.out.println("ID="+emp.getId());
- System.out.println("Name="+emp.getName());
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).start();
- new Thread(new Runnable(){
- @Override
- public void run() {
- int index = 0;
- try {
- while(true){
- Thread.sleep(5000);
- System.out.println(client.getServerInfo(index++));
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).start();
- System.out.println("");
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (RemoteException e) {
- e.printStackTrace();
- } catch (NotBoundException e) {
- e.printStackTrace();
- }
- }
- }
运行服务端和客户端测试
运行命令rmic 生产总框架
- 在命令行运行 rmic com.diaoge.java.RemoteInterfaceImpl
- 然后把生产的RemoteInterfaceImpl_stub.class拷贝到客户端