主题:RMI同一内网不同机器连接问题
我用java写了一个RMI的服务程序和客户端程序,首先说明一下我的服务端程序和客户端程序是两个不同的项目,如果服务端程序和客户端程序在同一太电脑上访问是没有问题的,但是我把客户端程序拷贝到同一内网的其他机器上就不行了,Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.40.10:1099 connect,resolve)
说明:192.168.40.10是服务器的内网IP,请问这是什么原因
下面是我的服务器代码
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMISocketFactory;
public class RMIServer {
/**
* @param args
* @throws AlreadyBoundException
*/
public static void main(String[] args) throws RemoteException,MalformedURLException, AlreadyBoundException {
// 不必再执行rmiregistry了
Registry r = LocateRegistry.getRegistry();
LocateRegistry.createRegistry(1099);
HelloInterface hello = new Helloimpl();
// 注册服务
Naming.rebind("rmi://192.168.40.10/hello",hello);
}
}
下面是客户端代码
public static void main(String[] args) throws MalformedURLException,RemoteException,NotBoundException{
System.setSecurityManager(new RMISecurityManager());
HelloInterface hello = (HelloInterface) Naming.lookup("//192.168.40.10/hello");
System.out.println(hello.sayHello());
}
}
在客户端和服务器端都有_stub.class文件,在网上看到一些帖子说需要_stub.class和_Skel.class,_Skel.class是放在服务器端,_stub.class是放在客户端,但是很奇怪的是我的生成出来只有_stub.class而没有_Skel.class,后来又在网上看到一句话:
jdk1.5对rmi作了简化,只生成_stub.class。
_Skel.class是jdk1.4及以下版本才有的。
我用的是JDK1.6,如果是优化应该就是正常的撒,所以在客户端和服务器端都有_stub.class文件,还是不行,总不可能让我在装一个1.4的来生成一个_Skel.class吧.
在JDK和JRE的java.policy都加上了
permission java.net.SocketPermission "*:1024-65535","connect,accept";
permission java.security.AllPermission "", "";
现在我真的不知道是怎么回事了,如果有哪位大哥知道怎么解决这个错误,请及时告诉我
说明:192.168.40.10是服务器的内网IP,请问这是什么原因
下面是我的服务器代码
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMISocketFactory;
public class RMIServer {
/**
* @param args
* @throws AlreadyBoundException
*/
public static void main(String[] args) throws RemoteException,MalformedURLException, AlreadyBoundException {
// 不必再执行rmiregistry了
Registry r = LocateRegistry.getRegistry();
LocateRegistry.createRegistry(1099);
HelloInterface hello = new Helloimpl();
// 注册服务
Naming.rebind("rmi://192.168.40.10/hello",hello);
}
}
下面是客户端代码
public static void main(String[] args) throws MalformedURLException,RemoteException,NotBoundException{
System.setSecurityManager(new RMISecurityManager());
HelloInterface hello = (HelloInterface) Naming.lookup("//192.168.40.10/hello");
System.out.println(hello.sayHello());
}
}
在客户端和服务器端都有_stub.class文件,在网上看到一些帖子说需要_stub.class和_Skel.class,_Skel.class是放在服务器端,_stub.class是放在客户端,但是很奇怪的是我的生成出来只有_stub.class而没有_Skel.class,后来又在网上看到一句话:
jdk1.5对rmi作了简化,只生成_stub.class。
_Skel.class是jdk1.4及以下版本才有的。
我用的是JDK1.6,如果是优化应该就是正常的撒,所以在客户端和服务器端都有_stub.class文件,还是不行,总不可能让我在装一个1.4的来生成一个_Skel.class吧.
在JDK和JRE的java.policy都加上了
permission java.net.SocketPermission "*:1024-65535","connect,accept";
permission java.security.AllPermission "", "";
现在我真的不知道是怎么回事了,如果有哪位大哥知道怎么解决这个错误,请及时告诉我