1.RMI简单来说就是本地只有接口去调用实现在另外一台机子上的方法而得到结果。下面写一简单例子,并且
在两台机子上测试过。
2.RMI编写步骤:
1)、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2)、定义一个实现该接口的类。 3)、创建一个服务器。 4). 创建一个客户程序进行RMI调用。
3.写接口 IHelloRMI.java
package com.rmi.interfaces;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHelloRMI extends Remote
//(必须继承Remote)
{
public
String sayHello() throws RemoteException;//必须声明式抛出异常
}
4.写实现类 HelloRMI .java
package com.rmi.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.rmi.interfaces.IHelloRMI;
//必须继承UnicastRemoteObject
public class HelloRMI extends
UnicastRemoteObject implements IHelloRMI
{
public
HelloRMI() throws RemoteException//必须得有一构造方法
{
super();
}
@Override
public
String sayHello() throws RemoteException
{
return "Hello RMI";
}
}
5.写服务器 RMIServer.java
package com.rmi.server;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import com.rmi.impl.HelloRMI;
public class RMIServer
{
public
static void main(String args[]) throws AlreadyBoundException
{
try
{
HelloRMI rmi = new HelloRMI();
Registry r = LocateRegistry.createRegistry(6666);
r.rebind("My_RMI", rmi);
System.out.println("starting.....");
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
}
6.写客户端
package com.rmi.click;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import com.rmi.interfaces.IHelloRMI;
public class Click
{
public
static void main(String args[])
{
try
{
IHelloRMI iRmi = (IHelloRMI)
Naming.lookup("rmi://192.168.203.1:6666/My_RMI");
System.out.println(iRmi.sayHello());
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (RemoteException e)
{
e.printStackTrace();
}
catch (NotBoundException e)
{
e.printStackTrace();
}
}
}
服务器端留接口,实现类,服务器即可,客户端留接口和客户端类即可,先将服务器端服务器运行起来,
然后运行客户端,注意如果你的电脑有多个网卡,注意客户端的Naming.lookup("rmi://192.168.203.1:6666/My_RMI")中的ip要写多哦,本人电脑由于安装了虚拟网卡,而服务端的LocateRegistry.createRegistry(6666);是在本地注册端口为6666,关键是这个本地使用的是到底哪张网卡呢,开始我的客户端老是报异常
java.rmi.ConnectIOException: Exception creating connection to:
10.10.10.1; neste
d exception is:
java.net.NoRouteToHostException: No route to host: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown
Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown
Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown
Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at
java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn
own Source)
而10.10.10.1是我另一张网卡的ip,它根本就不找192.168.203.1,而禁用10.10.10.1网卡又老是禁不了,最后一气之下把10.10.10.1的网卡卸载了就正常了。
最后附上个人在在客户端打包和运行的过程
C:\>javac com/rmi/click/Click.java
com/rmi/interfaces/IHelloRMI.java
C:\>jar cvf rmi.jar com/rmi/click/Click.class
com/rmi/interfaces/IHelloRMI.class
标明清单(manifest)
增加:com/rmi/click/Click.class(读入= 890) (写出= 579)(压缩了 34%)
增加:com/rmi/interfaces/IHelloRMI.class(读入= 236) (写出= 179)(压缩了
24%)
C:\>java -cp rmi.jar com.rmi.click.Click
Hello RMI