树莓派上的 RMI 不起作用 连接拒绝主机:127.0.0.1



我正在尝试使用java RMI在服务器(在Pi上)和客户端(在另一个PI上)之间进行通信。客户端能够调用服务器的远程方法,但是当服务器尝试访问客户端的远程方法时,我收到错误Connection refused to Host 127.0.0.1. 为了解决这个问题,我设置了System.setProperty("java.rmi.server.hostname", ServerIP;,但随后得到错误Connection refused to Host 10.10.*.*.

主接口看起来像

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MasterInterface extends Remote{
    public void sayHello(String s) throws RemoteException;
}

主.java文件如下所示

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Master extends UnicastRemoteObject implements MasterInterface{
    protected Master() throws RemoteException {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
        System.setProperty("java.rmi.server.hostname", "192.168.4.*");
            Master master = new Master();
            Registry reg = LocateRegistry.createRegistry(9898);
            reg.rebind("Master", master);
            System.out.println("Master is on.123123132.test.");

        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    @Override
    public void sayHello(String s) throws RemoteException {
        // TODO Auto-generated method stub
        System.out.println("Hiiiiiii ->>>>>"+s);
        try{
        Registry regi2 = LocateRegistry.getRegistry("192.168.*.*", 9898);
        System.out.println("asdasdasd1!!");
        SlaveInterface bsObj1 = (SlaveInterface) regi2.lookup("Slave");
        bsObj1.saybye("madhav");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

从属接口看起来像

    import java.rmi.Remote;
    import java.rmi.RemoteException;

    public interface SlaveInterface extends Remote{
        public void saybye(String s) throws RemoteException;
    }

从属.java文件看起来像

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Slave extends UnicastRemoteObject implements SlaveInterface {
    private final static String master_IP = "192.168.4.*";
    protected Slave() throws RemoteException {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            System.setProperty("java.rmi.server.hostname", "192.168.*.*");
            Slave s = new Slave();
        Registry regclient = LocateRegistry.createRegistry(2525);
        System.out.println("slave obj bound!!");
        regclient.rebind("Slave", s);
        System.out.println("Slave is on..");
        Registry regi = LocateRegistry.getRegistry(master_IP, 9898);
        System.out.println("slave obj bound1111!!");
        MasterInterface bsObj = (MasterInterface) regi.lookup("Master");
        System.out.println("slave obj bound2222!!");
        bsObj.sayHello("hi karan");
        System.out.println("done................");
        }catch(Exception e){
            System.out.println("not working!!!!!!!!!!");
            e.printStackTrace();
        }
    }
    @Override
    public void saybye(String s) throws RemoteException {
        // TODO Auto-generated method stub
        System.out.println("bye "+s);

    }
}

导出任何远程对象之前,将java.rmi.server.hostname设置为服务器 JVM 中服务器的外部 IP 地址。请参阅 RMI 常见问题解答第 A.1 项。

几年前

遇到过这个问题,因为名称解析(默认情况下主机名将解析为 127.0.0.1 - 环回接口的 IP 地址)。

如果您没有 DNS 服务器,请尝试以下操作:

为两个 Pi 分配不同的主机名(在 /etc/hostname 中设置)或使用 hostname 命令。

例如,如果使用"master"和

"client"作为主机名,并且 10.10.10.13 和 10.10.10.14 是它们的 IP 地址,请将以下信息添加到文件 /etc/hosts 中,在两个 Pi 中:

10.10.10.13 master
10.10.10.14 client

最新更新