这两天想看下分布式。分布式首先要用到java的RMI服务。所以先开始自己部署个RMI服务来体验一下。跌跌撞撞...总算是搞出来了。
先把代码要调用的代码贴出来4个类
IMyRMIService、MyRMIService、Server、Client。
IMyRMIService接口:
package org.yohoph.rmis;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IMyRMIService extends Remote{
public void sayHello() throws RemoteException;
}
MyRMIService类:
package org.yohoph.rmis;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyRMIService extends UnicastRemoteObject implements IMyRMIService{
/**
*
*/
private static final long serialVersionUID = 13265462254L;
public MyRMIService() throws RemoteException {
super();
}
public void sayHello() throws RemoteException{
System.out.println("Hello!");
}
}
Server类(服务端发布)
package org.yohoph.rmis;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class Server {
public Server(){
try {
IMyRMIService service = new MyRMIService();
Naming.rebind("rmi://localhost:1099/MyRMIService", service);
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server();
}
}
Client类(客户端):
package org.yohoph.rmis;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class Client {
public static void main(String[] args) {
try {
IMyRMIService service = (IMyRMIService) Naming.lookup("rmi://localhost:1099/MyRMIService");
service.sayHello();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:JDK默认是已经安装了的。
先将代码编译完毕之后,打开命令行,进入工程目录下(也就是class文件生成的目录以此为根目录,以下所有的命令得在根目录下执行):
服务端执行:
1.注册并打开RMI服务—— 键入命令: rmiregistry
2.打开服务端—— 键入命令: java -Djava.security.policy=policy.txt org.yohoph.rmis.Server
客户端执行:
1.生成_Stub的类文件:rmic org.yohoph.rmis.MyRMIService。stub.class文件是放在客户端中用的,服务端貌似不用这个文件。
2..执行客户端内容。即可看到效果。
总结一下:
服务端代码核心就是
Naming.rebind("rmi://localhost:1099/MyRMIService", service);
我简单看了下源码,第一个参数的name属性类似于网络中的ID,客户端调用的时候就是用的这个ID,也可以不用url,而改用任意的其他参数名称。但是我估计这样在跨主机访问的时候,可能会出点问题,建议采用URL的格式来设定Name值。当这个Name是URL的时候,那么他就是个正常的服务。如果是换不同主机访问的话如果更新URL的值,将localhost改成服务端主机的地址即可。再则端口号,好像也有限制,我没有详细看资料,如果有人知道的也可以帮忙补充下,最少已经使用过了的端口是不能提供出去的。不然就会报连接异常。