【问题标题】:RMI : NotBoundExceptionRMI:未绑定异常
【发布时间】:2015-05-14 23:49:16
【问题描述】:

我已经用这些当前文件实现了一个 RMI 接口;

MyClient.java - Clientside code  
MyServer.java - Serverside code  
Adder.java - Interface  
AdderRemote.java - Remote _implements Adder_  
DataAccess.java - Contains all the methods to interveen between server and client

我有一个vps,它包含目录中除客户端文件之外的所有文件

vps:~/rmi#  

当自己测试时,ie: 在服务器上编译,做

rmic AdderRemote  
rmiregistry 5000&

(我选择的端口)

java -classpath .:mysql-connector... MyServer

然后在本地执行相同的过程,但改为运行 MyClient java,它可以工作。我现在面临的问题是将其实现到我在 Eclipse 中运行的项目中;

我在主文件中有一个 MyClient 实例,然后将其作为参数传递给某些类(这个项目实现了 MVC 模式并传递给其他模型类'),我是现在收到错误

java.rmi.NotBoundException: xox

谷歌搜索后,我能找到的唯一回应是“尝试查找未绑定的名称。”,但我不确定这是什么意思?我会附上我的代码,任何帮助将不胜感激。

MyClient.java

public class MyClient 
{
public Adder stub;

public MyClient ()
{
    try 
    {
        stub = (Adder)Naming.lookup("rmi://92.222.2.96:5000/xox");

    } 
    catch (Exception e) 
    {
        System.out.println(e.toString());
    }
}

public static void connect(Adder stub) throws RemoteException 
{
    System.out.println(stub.connect());
}

Adder.java

public interface Adder extends Remote 
{
public String connect() throws RemoteException;
}

AdderRemote.java

public class AdderRemote extends UnicastRemoteObject implements Adder 
{
public AdderRemote() throws RemoteException 
{
    super();
    da = new DataAccess();
}

DataAccess da;

public String connect() throws RemoteException
{
    return da.connect();
}

DataAccess.java

public class DataAccess 
{
// Connection info
static final String URL = "jdbc:mysql://92.222.2.96:3306/groupproj";
static final String DRIVER = "com.mysql.jdbc.Driver";
static final String USERNAME = "root";
static final String PASSWORD = "*****";
Connection c = null;  

public String connect()
{
    try
    {
        Class.forName(DRIVER).newInstance();                                                            //Load DB driver
        c = DriverManager.getConnection(URL, USERNAME, PASSWORD);                                       //Establish connection to DB2
        return "Connected.";                
    }
    catch(Exception e)
    {
        return e.toString();
    }
}

MyServer.java

 public class MyServer 
 {
    public static void main ( String args[] ) 
    {
            try
        {
                    Adder stub = new AdderRemote();
                    Naming.rebind("rmi://92.222.2.96:5000/xox", stub);
            } 
            catch ( Exception e ) 
            {
                System.out.println(e);
            }
    }

    public static void connect(Adder stub) throws RemoteException
    {
            try
            {
                    stub.connect();
            }
            catch(Exception e)
            {
                    System.out.println("Could not connect to the DB.");
            }
    }

我收集到,因为服务器上的文件位于目录“rmi”中,所以我将 xox 重命名为这个,但这并没有解决问题,所以我将它恢复为 xox,它之前工作过 将其放入 java 项目中。

谢谢

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    你一定是在绑定时遇到了异常。

    如果您在应该绑定的同一个注册表中查找相同的名称时得到NotBoundException,那么您根本没有绑定它。

    注意事项:

    • 您只能绑定到与您在同一主机上运行的注册表。因此,在调用bind(), rebind(),unbind(). 时始终使用"localhost" 作为主机名会很方便

    • 最好让RemoteExceptionNotBoundExceptionMyClient. 的构造函数中抛出

    • MyClient.connect() 不应该是静态的。事实上,它不可能是静态的。 所以这不可能是真正的代码。

    • 从我们目前看到的情况来看,您的系统设计不正确。您的服务器应该在需要时获得一个 DBMS 连接,在远程方法中,代表调用该方法的客户端,并在退出该方法之前释放它。每次客户端明确请求一个新连接并将其存储到远程对象的实例变量中时打开一个新连接 (a) 将泄漏连接并且 (b) 当并发客户端来执行查询或更新时将无法工作连接。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2013-04-04
      • 1970-01-01
      • 2012-10-13
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多