&引用;java.rmi.ConnectException:连接拒绝承载;导出对象客户端时

&引用;java.rmi.ConnectException:连接拒绝承载;导出对象客户端时,java,jvm,client-server,virtual-machine,rmi,Java,Jvm,Client Server,Virtual Machine,Rmi,我现在已经坚持了至少5个小时了,除了在这里提问,我别无选择。我正在写一个RMI应用程序。我希望服务器绑定一个远程对象(NoteBoardImpl),客户端将查找该对象。客户端将其侦听器(NoteBoardListener此处)传递给服务器,侦听器也是客户端导出的远程对象 我在这里准备了一个简单的SSCCE,所以我真的希望有人能研究一下。所有类都位于默认包的同一文件夹中。我知道这是不鼓励的,我应该把应用程序分成三个罐子,但我想在这里让它尽可能简单 远程接口: 接口实现: 客户端和服务器: 注意

我现在已经坚持了至少5个小时了,除了在这里提问,我别无选择。我正在写一个RMI应用程序。我希望服务器绑定一个远程对象(
NoteBoardImpl
),客户端将查找该对象。客户端将其侦听器(
NoteBoardListener
此处)传递给服务器,侦听器也是客户端导出的远程对象

我在这里准备了一个简单的SSCCE,所以我真的希望有人能研究一下。所有类都位于默认包的同一文件夹中。我知道这是不鼓励的,我应该把应用程序分成三个罐子,但我想在这里让它尽可能简单

远程接口:


接口实现:


客户端和服务器:

注意如何在服务器的注册表中成功地查找对象,然后导出客户端远程对象(同样成功),执行在第14行中断,我试图调用传递客户端对象的服务器端对象上的方法

我在这两个系统上都没有防火墙,两个方向的ping都可以完美地进行。我知道这里一定有一些概念上的问题,当然我对RMI有些误解。我非常感谢你的帮助


二进制代码基是,以及。提前谢谢你

下面是我要做的事情来弄清这件事的真相

  • 运行你的服务器应用程序
  • 找出它用于RMI的端口(它是短暂的,所以应该为您创建的每个服务器进程更改)

    • 使用ps-ef查找PID
    • 然后netstat-anp | grep这应该会给你端口号。它应该绑定到0.0.0.0
  • 在客户端VM上,使用nc或telnet验证是否可以连接到端口。如果失败,您可能会遇到防火墙/iptables问题

  • 使用wireshark验证您的客户机实际上正在尝试连接到您从步骤2中了解到的端口/ip组合

  • 记住,仅仅因为您可以ping,并不意味着您可以连接到给定的端口。同时选中“iptables-L”


    另外,表示不要放置URL的scheme组件。格式应该是//host:port/name,因此您也应该检查它

    好了,终于解决了。问题是,我在两个程序中都传递了相同的
    java.rmi.server.hostname
    参数,这意味着客户端和服务器都在这里获得了服务器的地址。事实证明,如果客户机想要导出自己的对象,它必须向
    java.rmi.server.hostname
    提供自己的IP。这样一切都很好

    总之,我必须给服务器提供3个参数:
    RMI\u IP RMI\u端口服务器\u主机名

    向客户提供3个类似的参数:

    RMI_IP RMI_端口客户端_主机名

    谢谢你的建议,事实上我不知道测试端口连接性的好方法。无论如何,这里的一切似乎都很好,无论我是在主机上运行服务器还是在虚拟机上运行服务器。我了解到我的一个朋友在VM和主机之间运行这个时遇到了问题,所以我明天会问他,希望能在这里发布解决方案。但我仍然在等待你的建议,如果你能在这里发现一些明显的错误。如果你正在为你的虚拟机使用NAT连接,请尝试桥接连接。。这可能是您的问题所在,否则,如果您想使用NAT,您必须设置一个端口转发(使用RMI可能不容易)。虽然这并不能解释为什么你可以从客户端连接到注册中心。我在VirtualBox中使用的是一个只支持主机的适配器。我不确定它是如何模拟网络的。稍后我将尝试桥接适配器。您能从192.168.56.101 ping 192.168.56.1吗?是的,正如我所写的“双向ping完美无瑕”。此外,我可以远程登录到RMI注册表和服务器端口,而不管我在哪台机器上运行服务器,因此我可以在主机或虚拟机上运行服务器,并可以通过远程登录从另一台机器连接到端口。
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface INoteBoard extends Remote {
        public void test(INoteBoardListener listener) throws RemoteException;
    }
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface INoteBoardListener extends Remote {
        public void onNewText(String text) throws RemoteException;
    }
    
    import java.rmi.RemoteException;
    
    public class NoteBoardImpl implements INoteBoard {
        @Override
        public void test(INoteBoardListener listener) throws RemoteException {
            listener.onNewText("server call the listener");
        }
    }
    
    import java.rmi.RemoteException;
    
    public class NoteBoardListener implements INoteBoardListener {
        @Override
        public void onNewText(String text) throws RemoteException {
            System.out.println(text);
        }
    }
    
    import java.rmi.Naming;
    import java.rmi.server.UnicastRemoteObject;
    
    public class Client {
        public static void main(String[] args) {
            if (args.length < 2) {
                System.out.println("2 arguments required:\nRMI_IP RMI_port");
                return;
            }
            System.setProperty("java.rmi.server.hostname", args[0]);
            try {
                INoteBoard nb = (INoteBoard) Naming.lookup(String.format("rmi://%s:%s/note", args[0], args[1]));
                INoteBoardListener l = (INoteBoardListener) UnicastRemoteObject.exportObject(new NoteBoardListener(), 0);
                nb.test(l);
                l.onNewText("client invokes listener");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    import java.rmi.Naming;
    import java.rmi.server.UnicastRemoteObject;
    
    public class Server {
        public static void main(String[] args) {
            if (args.length < 2) {
                System.out.println("2 arguments required:\nRMI_IP RMI_port");
                return;
            }
            System.setProperty("java.rmi.server.hostname", args[0]);
            try {
                INoteBoard noteBoard = (INoteBoard) UnicastRemoteObject.exportObject(new NoteBoardImpl(), 0);
                Naming.rebind(String.format("rmi://%s:%s/note", args[0], args[1]), noteBoard);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    java.rmi.ConnectException: Connection refused to host: 192.168.56.1; nested exception is: 
        java.net.ConnectException: Connection refused
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        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.invoke(UnicastRef.java:128)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
        at sun.proxy.$Proxy0.test(Unknown Source)
        at Client.main(Client.java:14)
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
        at java.net.Socket.connect(Socket.java:546)
        at java.net.Socket.connect(Socket.java:495)
        at java.net.Socket.<init>(Socket.java:392)
        at java.net.Socket.<init>(Socket.java:206)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        ... 7 more