服务接口:
package com.zzj.jndi.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface JndiService extends Remote {
public int getNext() throws RemoteException;
}
接口实现类:
package com.zzj.jndi.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.zzj.jndi.service.JndiService;
/**
* Unicast:单播(点到点)
* @author lenovo
*
*/
public class JndiServiceImpl extends UnicastRemoteObject implements JndiService {
private static final long serialVersionUID = 1L;
private int next;
public JndiServiceImpl() throws RemoteException {
super();
}
/**
* 非线程安全的
*/
public int getNext() throws RemoteException {
return ++next;
}
}
提供者:
package com.zzj.jndi.provider;
import java.rmi.registry.LocateRegistry;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.zzj.jndi.service.JndiService;
import com.zzj.jndi.service.impl.JndiServiceImpl;
public class RmiServiceProvider2 {
final static String CONTEXT_FACTORY = "com.sun.jndi.rmi.registry.RegistryContextFactory";
final static String PROVIDER_URL = "rmi://127.0.0.1:8080";
public static void main(String[] args) throws Exception {
/* 必须将java.rmi.server.hostname设置为服务器对外公布的IP,
* 否则客户端会去找127.0.0.1
*/
System.setProperty("java.rmi.server.hostname", "192.168.80.129");
System.setProperty("java.security.policy", "/root/Desktop/rmi.policy");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
//注册RMI服务器端口
LocateRegistry.createRegistry(8080);
Hashtable<String, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
Context ctx = new InitialContext(env);
JndiService jndiService = new JndiServiceImpl();
ctx.bind("jndiService", jndiService);
System.out.println("Jndi服务已绑定...");
}
}
安全策略文件rmi.policy:
grant {
permission java.security.AllPermission;
};
提供者和客户端都需要安全策略文件,内容相同。
客户端:
package com.zzj.jndi.client;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.zzj.jndi.service.JndiService;
public class RmiJndiClient2 {
final static String CONTEXT_FACTORY = "com.sun.jndi.rmi.registry.RegistryContextFactory";
final static String PROVIDER_URL = "rmi://192.168.80.129:8080";
public static void main(String[] args) throws Exception {
System.setProperty("java.security.policy", "E:\\eclipsejee\\javase\\src\\rmi.policy");
if(System.getSecurityManager() == null){
System.setSecurityManager(new SecurityManager());
}
Hashtable<String, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
Context ctx = new InitialContext(env);
JndiService jndiService = (JndiService) ctx.lookup("jndiService");
for (int i = 0; i < 5; i++) {
System.out.println(jndiService.getNext());
}
System.out.println("-------------------");
JndiService jndiService2 = (JndiService) ctx.lookup("jndiService");
for (int i = 0; i < 5; i++) {
System.out.println(jndiService2.getNext());
}
}
}
把服务接口类、实现类以及提供者打包成Jar包,放到192.168.80.129(Linux)上,启动提供者:
java -cp RMIProvider2.jar com.zzj.jndi.provider.RmiServiceProvider2
再运行客户端(windows),效果如下:
1
2
3
4
5
-------------------
6
7
8
9
10