首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMI : NotBoundException

RMI : NotBoundException
EN

Stack Overflow用户
提问于 2015-05-14 23:49:16
回答 1查看 3.9K关注 0票数 1

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
vps:~/rmi#  

在自己测试时,即:在服务器上编译,执行

代码语言:javascript
复制
rmic AdderRemote  
rmiregistry 5000&

(我选择的港口)

代码语言:javascript
复制
java -classpath .:mysql-connector... MyServer

然后在本地执行相同的进程,但却运行MyClient java,它可以工作。我现在面临的问题是将它实现到一个我已经在eclipse中运行的项目中,作为其中的一部分;

我在主文件中有一个MyClient实例,然后作为参数传递给特定的类(这个项目实现了MVC模式,并被传递给同类模型类‘),现在我得到了错误

代码语言:javascript
复制
java.rmi.NotBoundException: xox

在谷歌搜索后,我能找到的唯一回应是“试图查找一个没有绑定的名称”,但我不太确定这意味着什么?我会附上我的代码,任何帮助都将不胜感激。

MyClient.java

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface Adder extends Remote 
{
public String connect() throws RemoteException;
}

AdderRemote.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
 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,但这并没有解决问题,所以我将其恢复为xox,在将其放入java项目之前,xox工作了。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-05-15 00:49:41

您一定有一个异常执行绑定。

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

备注:

  • 您只能绑定到与您在同一台主机上运行的注册表。因此,在调用"localhost"unbind().时,总是使用bind(), rebind(),作为主机名是很方便的。
  • 最好让RemoteExceptionNotBoundExceptionMyClient.的构造函数中抛出
  • MyClient.connect()不应该是静态的。事实上,它不可能是静态的。因此,这不可能是真正的代码。
  • 从我们目前所能看到的情况来看,您的系统设计不正确。当服务器需要一个DBMS连接时,它应该代表调用该方法的客户端在远程方法中获得一个DBMS连接,并在退出该方法之前释放它。每次客户端请求一个外显性并将其存储到远程对象的实例变量中时,都会打开一个新连接(a)会泄漏连接,(b)当并发客户端来执行同一连接上的查询或更新时,它将无法工作。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30249314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档