【问题标题】:RMI Server Cannot Get StartedRMI 服务器无法启动
【发布时间】:2018-03-31 04:48:16
【问题描述】:

我正在尝试在 Eclipse neon IDE 中使用 RMI 构建火警系统。但是当我在启动 rmiregistry 后尝试运行 Server.java 文件时,它会显示以下错误。

java.rmi.server.ExportException: object already exported
    at sun.rmi.transport.ObjectTable.putTarget(Unknown Source)
    at sun.rmi.transport.Transport.exportObject(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
    at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
    at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
    at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
    at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
    at server.Server.main(Server.java:33)

这是我项目中所有类的代码

Service.java 文件

package server;

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

public interface Service extends Remote{
public void startService() throws RemoteException;

}

FireAlarmService.java 文件

package server;

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

import sensors.BatterySensor;
import sensors.CO2Sensor;
import sensors.HumiditySensor;
import sensors.Sensor;
import sensors.TempSensor;

public class FireAlarmService extends UnicastRemoteObject implements     Service,Runnable {
protected FireAlarmService() throws RemoteException {
    super();
}

Sensor tempSensor = new TempSensor();
Sensor humiditySensor = new HumiditySensor();
Sensor co2Sensor = new CO2Sensor();
Sensor batterySensor = new BatterySensor();

@Override
public void run() {
    Thread tempThread = new Thread(tempSensor);
    Thread humidityThread = new Thread(humiditySensor);
    Thread co2Thread = new Thread(co2Sensor);
    Thread batteryThread = new Thread(batterySensor);

    tempThread.start();
    humidityThread.start();
    co2Thread.start();
    batteryThread.start();
    System.out.println();

    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

    @Override
    public void startService() {
        while(true){
            run();  
        }       
    }
}

Server.java 文件

package server;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server{
    public static void main(String args[]){

        //new code tried to apply.ended in an 3 excception
        /*try {     
            FireAlarmService service = new FireAlarmService();
            Naming.rebind("rmi://localhost/fireAlarmService", service);         
            System.out.println("Server is ready.");         
        }catch (Exception e) {      
            System.out.println("Addition Server failed: " + e);         
        }
    }*/

        FireAlarmService service = null;
        try {
            service = new FireAlarmService();
        } catch (RemoteException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            System.setProperty("java.rmi.server.hostname","192.168.1.2");
            Service stub = (Service)        UnicastRemoteObject.exportObject(service,9000);
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("AlarmService", stub);
            System.out.println("Server ready");
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }/* catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

    }
}

Sensor.java

package sensors;

public abstract class Sensor implements Runnable{
    String sensorID = "Not Set";

    public void setSensorID(String sensorID){
        this.sensorID = sensorID;
    }

    public String getSensorID() {
        return this.sensorID;
    }

    public abstract void setSensorData();
    public abstract double getSensorData();
}

BatterySensor.java

package sensors;

public class BatterySensor extends Sensor{
    double batteryLevel = 100;

    @Override
    public void setSensorData() {
        if(batteryLevel <= 0){
            batteryLevel = 100;
        }
        else{
            batteryLevel--; 
        }
    }

    @Override
    public double getSensorData() {
        return batteryLevel;
    }

    @Override
    public void run() {
        setSensorData();        
        System.out.println("Battery Level : " + getSensorData());

        /*try {     
            Thread.sleep(3000);         
        } catch (InterruptedException e) {  
            e.printStackTrace();            
        }*/
    }

    /*public static void main(String args[]){
        BatterySensor sensor = new BatterySensor();

        while(true){
            sensor.run();   
        }       
    }*/
}

CO2Sensor.java

package sensors;

public class CO2Sensor extends Sensor{
    double co2Level = 0;

    @Override
    public void setSensorData() {
        co2Level = Math.round(Math.random()) * 10;
    }

    @Override
    public double getSensorData() {
        return co2Level;
    }

    @Override
    public void run() {             
        setSensorData();        
        System.out.println("CO2 Level : " + getSensorData());

        /*try {     
            Thread.sleep(3000);         
        } catch (InterruptedException e) {  
            e.printStackTrace();            
        }*/
    }

    /*public static void main(String args[]){
        CO2Sensor sensor = new CO2Sensor();

        while(true){
            sensor.run();   
        }       
    }*/

}

HumiditySensor.java

package sensors;

public class HumiditySensor extends Sensor{
    double humidity = 0;
    @Override
    public void setSensorData() {
        humidity = Math.round(Math.random()) * 10;
    }

    @Override
    public double getSensorData() {
        return humidity;
    }

    @Override
    public void run() {
        setSensorData();        
        System.out.println("Humidity : " + getSensorData());

        /*try {     
            Thread.sleep(3000);         
        } catch (InterruptedException e) {  
            e.printStackTrace();            
        }*/
    }

    /*public static void main(String args[]){
        CO2Sensor sensor = new CO2Sensor();

        while(true){
            sensor.run();   
        }       
    }*/
}

TempSensor.java

package sensors;

public class TempSensor extends Sensor{
    double temperature = 0;
    @Override
    public void setSensorData() {
        temperature = Math.round(Math.random()) * 10;
    }

    @Override
    public double getSensorData() {
        return temperature;
    }

    @Override
    public void run() {
        setSensorData();        
        System.out.println("Temperature : " + getSensorData());

        /*try {     
            Thread.sleep(3000);         
        } catch (InterruptedException e) {  
            e.printStackTrace();            
        }*/
    }

    /*public static void main(String args[]){
        CO2Sensor sensor = new CO2Sensor();

        while(true){
            sensor.run();   
        }       
    }*/
}

Client.java

package client;

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

import server.Service;

public class Client implements Runnable{
    static Service stub = null;
    @Override
    public void run() {
        try {
            stub.startService();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }

    public static void main(String args[]){
        try {
            Registry registry = LocateRegistry.getRegistry();
            stub = (Service) registry.lookup("FireAlarmService");
            new Client().run();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

我没有检查 Client.java..所以如果你也可以检查它是否有错误。 附言: 我不想让你们失望。但是链接JAVA: RMI Callback -> object already exported 上的答案对我不起作用。

【问题讨论】:

  • eclipse 与此无关。不要乱加标签。
  • 抱歉 EJP。我不知道。我是 Java RMI 中的一个业余爱好者
  • 但是您可以看到 Eclipse 在这方面没有发挥任何作用。只需 RMI 和您自己的代码。

标签: java rmi


【解决方案1】:

这个:

FireAlarmService extends UnicastRemoteObject

表示此类的实例将在构造时自动导出。

因此,您不能也不得使用此类的实例调用 UnicastRemoteObject.exportObject()。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2019-03-28
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多