我已经用这些当前文件实现了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,其中包含目录中除Client文件以外的所有文件

vps:~/rmi#


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

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,但这并不能解决问题,因此我将其还原为xox,在将其放入Java项目之前它可以正常工作。 。

谢谢

最佳答案

您必须在执行绑定时遇到异常。

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

笔记:


您只能绑定到与您在同一主机上运行的注册表。因此,在调用"localhost"bind(), rebind(),时始终将unbind().用作主机名是很方便的
最好让RemoteExceptionNotBoundExceptionMyClient.的构造函数中抛出
MyClient.connect()不应为静态。实际上,它不能是静态的。因此,这不是真实的代码。
从到目前为止我们可以看到,您的系统设计不正确。当您的服务器需要一个远程方法内的DBMS连接时,该服务器应代表正在调用该方法的客户端,并在退出该方法之前将其释放。每次客户端请求一个显式请求时都打开一个新连接,并将其存储到远程对象的实例变量中(a)将泄漏连接,并且(b)当并发客户端开始在同一对象上执行查询或更新时将不起作用连接。

08-26 02:08