RMI注册表权限被拒绝

我正在尝试使用Java RMI,但是当我的组件尝试绑定(甚至连接)到 rmiregistry 时,我一直遇到错误。每当我尝试将任何东西绑定到 rmiregisrty 时,我都会收到java.rmi.ConnectIOException。老实说,我对解决此问题需要做些什么。

代码

服务器

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
    public static void main(String[] args) throws Exception {
        
        HelloClass Obj = new HelloClass();

        Registry registry = LocateRegistry.getRegistry();

        registry.bind("Hello",Obj);

        System.out.println("Server is live");
    }
}

客户

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class Client {
    public static void main(String[] args) throws Exception{
        
        Registry registry = LocateRegistry.getRegistry();

        Hello hello = (Hello) registry.lookup("Hello");

        String n = hello.Hello();

        System.out.println(n);
    }
}

你好(界面)

import java.rmi.*;

public interface Hello extends Remote {

    public String Hello() throws RemoteException;

}

HelloClass

import java.rmi.server.UnicastRemoteObject;

public class HelloClass extends UnicastRemoteObject implements Hello  {

    public HelloClass() throws Exception{
        super();
    }

    public String Hello(){
        return "Hello world!";
    }

}

错误

"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\lib\idea_rt.jar=57417:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;C:\Users\Roman\Desktop\RMI3\out\production\RMI3" Server
Exception in thread "main" java.rmi.ConnectIOException: Exception creating connection to: 192.168.2.21; nested exception is: 
    **"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\lib\idea_rt.jar=57417:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;C:\Users\Roman\Desktop\RMI3\out\production\RMI3" Server
Exception in thread "main" java.rmi.ConnectIOException: Exception creating connection to: 192.168.2.21; nested exception is: 
    java.net.SocketException: Permission denied: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
    at sun.rmi.registry.RegistryImpl_Stub.bind(RegistryImpl_Stub.java:60)
    at Server.main(Server.java:15)
Caused by: java.net.SocketException: Permission denied: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at sun.rmi.transport.proxy.RMIDirectsocketFactory.createSocket(RMIDirectsocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 5 more
**
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
    at sun.rmi.registry.RegistryImpl_Stub.bind(RegistryImpl_Stub.java:60)
    at Server.main(Server.java:15)
Caused by: java.net.SocketException: Permission denied: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at sun.rmi.transport.proxy.RMIDirectsocketFactory.createSocket(RMIDirectsocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 5 more

bill58702738 回答:RMI注册表权限被拒绝

在Server类中,您正在通过调用LocateRegistry.getRegistry()方法来检索远程对象注册表引用。

由于未传递主机名和端口,因此内部将使用java.net.InetAddress.getLocalHost().getHostAddress() api派生主机名。

根据错误消息,主机名派生为192.168.2.21,但是在该IP上尝试在端口1099中创建套接字的操作却给出了“权限被拒绝”错误。

运行服务器类的主机,

该节点是否具有IP_ADDRESS 192.168.2.21吗?

您可以使用

进行检查
ipconfig /all

您可以使用java.net.InetAddress.getLocalHost().getHostAddress() api进行检查。

我认为最好您尝试将主机名和端口传递给LocateRegistry.getRegistry("127.0.0.1",1099)方法。更改包含在服务器和客户端代码中。

Server.java

package rmi.learning;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
    public static void main(String[] args) throws Exception {
        try {
            HelloClass Obj = new HelloClass();
            Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);
            System.out.println("registry=" + registry);
            registry.bind("Hello",Obj);
            System.out.println("Server is live");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Client.java

package rmi.learning;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class Client {
    public static void main(String[] args) throws Exception{
        
        Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);

        Hello hello = (Hello) registry.lookup("Hello");

        String n = hello.Hello();

        System.out.println(n);
    }
}

我已将所有类放入rmi.learning包中。

Hello.java

package rmi.learning;

import java.rmi.*;

public interface Hello extends Remote {

    public String Hello() throws RemoteException;

}

HelloClass.java

package rmi.learning;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class HelloClass extends UnicastRemoteObject implements Hello {

    protected HelloClass() throws RemoteException {
        super();
    }

    public String Hello() {
        return "Hello world!";
    }
}

启动rmi注册服务

start  d:\Java\jdk1.8.0_261\bin\rmiregistry

在命令提示符下: 执行服务器

cd d:\workspace_europa\StackOverflow\bin

start /B  D:\Java\jdk1.8.0_261\bin\java.exe -classpath .;rmi -Djava.rmi.server.codebase=file:rmi/ rmi.learning.Server

输出:

registry=RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[127.0.0.1:1099](remote),objID:[0:0:0,0]]]]
Server is live

在命令提示符下: 执行客户端

D:\Java\jdk1.8.0_261\bin\java.exe -classpath .  rmi.learning.Client

输出:

Hello world!

更多调查:

我试图重现此问题,我通过路由器连接到Internet。连接到wifi后,路由器将分配IP地址192.168.0.102。 java.net.InetAddress.getLocalHost().getHostAddress() api返回IP地址为192.168.0.102

Wireless LAN adapter Wi-Fi:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : xxxx::xxxx:xxxx:xxxx:xxxx%18
   IPv4 Address. . . . . . . . . . . : 192.168.0.102
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.0.1
 

如果我尝试将rmi服务绑定到端口1099上的192.168.0.102,那么它可以正常工作。

但是,如果我连接到VPN,则将一个新IP分配给我的主机。连接到VPN时,IP 192.168.0.102不再可解析,并且我的机器IP_ADDRESS正在更改。这次,如果我尝试将rmi服务绑定到IP 192.168.0.102,则会收到错误java.net.SocketException: Permission denied: connect.

如果IP地址不再适用于当前节点,则会出现错误。

我在很多地方都看到有人建议使用 -Djava.net.preferIPv4Stack = true也是如此。在运行Server.class时,您可以尝试类似的

start /B  D:\Java\jdk1.8.0_261\bin\java.exe -Djava.net.preferIPv4Stack=true -classpath .;rmi -Djava.rmi.server.codebase=file:rmi/ rmi.learning.Server

即使人们在某些地方说要禁用系统上运行的任何反病毒软件,您也可以检查这种可能性。

本文链接:https://www.f2er.com/1479817.html

大家都在问