java RMI 基础教程

本文介绍 Java RMI (Remote Method Invocation) 的基本原理及实现步骤,并通过一个具体示例展示了如何搭建服务端与客户端进行远程方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java创建远程方法调用的步骤如下:

[list=1]
[*]定义一个扩展远程接口(Remote)的接口,这个接口方法将供给客户端调用,该接口中的每个方法都必须声明抛出RemoteException。

[*]定义一个实现该接口并扩展了UnicastRemoteObject的类(服务端运行的服务类),这个类将实现给客户端调用的所用方法。

[*]创建服务端供客户端调用的应用程序。

[*]创建客户端RMI调用服务端的应用程序。

[*]启动服务端,再启动客户端,测试是否调用成功。

[*]如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类路径下

[/list]


我的例子:


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拷贝到客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值