gpt4 book ai didi

java - 远程管理接口(interface) : NotBoundException

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:14 24 4
gpt4 key购买 nike

我已经使用这些当前文件实现了 RMI 接口(interface);

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#  

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

rmic AdderRemote  
rmiregistry 5000&

(我选择的端口)

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

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

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

java.rmi.NotBoundException: xox

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

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());
}

加法器.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 项目之前,它可以正常工作。

谢谢

最佳答案

您在进行绑定(bind)时一定遇到了异常。

如果您有 NotBoundException当在同一个注册表中查找您应该将其绑定(bind)到的相同名称时,您根本没有绑定(bind)它。

注释:

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

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

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

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

关于java - 远程管理接口(interface) : NotBoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com