1

我目前正在通过开发一种工具来学习 Java,该工具用于在客户端创建和填写多项选择表单并在服务器端保存和评估它们。我为网络部分使用了 RMI 教程中的代码框架,直到现在它工作正常。客户端和服务器应用程序都在同一个包中,但作为单独的应用程序运行。为了更容易开发,它们现在都在同一个系统上运行,尽管当事情完成时这会改变。

因此,让我们用一些代码切入正题,看看到底出了什么问题:

服务器.java

Server() throws RemoteException {
    super();
}

public static void main(String[] args) {
    try {
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
    }
    catch (RemoteException ex) {
        System.out.println("SERVER: " + ex.getMessage());
    }

    try {
        Naming.rebind("Server", new Server()); <---
    }
    catch(MalformedURLException ex) {
        System.out.println("SERVER: " + ex.getMessage());
    }
    catch(RemoteException ex) {
        System.out.println("SERVER: " + ex.getMessage());
    }
}

[...] methods that are called by the client via ServerInterface

<--- 标记 Client-GUI 的启动位置。

客户端.java

private static Gui_loadSets gui_loadSets = new Gui_loadSets();

public static void main(String[] args) {
    loadGuiLoadSets();
}

这是第一个 GUI 可见的地方;一个选择要从中加载的表单。这个 GUI 是通过启动服务器来加载的,即使我注释掉了。所以服务器并没有真正加载客户端应用程序,而是以某种方式神奇地访问它的 GUI 并无缘无故地显示它。

我已经尝试在加载 GUI 之前“进入”该行,但最终我陷入了无限循环,所以我真的不知道发生了什么。

这是我在这里的第一个问题,所以如果我错过了任何明显的问题,请原谅我。提前感谢您的帮助。如果您需要更多代码,我很乐意提供,但剩下的大部分代码都是关于多项选择形式的。

4

2 回答 2

0

Naming.rebind()需要一个 URL,而不仅仅是一个服务名称。它应该是

Naming.rebind("rmi://localhost/Server", new Server());

但我对你对这一行的评论感到困惑。它-->不会“标记客户端 GUI 的启动位置”,它标记了远程对象被构造、导出和绑定到注册表的行。客户端 GUI 位于客户端。

于 2012-09-13T04:12:40.420 回答
0

感谢您的努力,我现在可以正常工作了。

服务器创建对象的一个​​非常基本的类是指客户端提供的方法。所以显然这导致了问题。我一定忘记了它,因为它从一开始就在那里,但不知何故刚刚开始成为一个可见的问题。

对于我糟糕的设计给您带来的任何不便,我深表歉意。:)

Also, how do I mark this problem as solved without being frowned upon? Do people attach importance to getting the accepted-answer-button? I can't do this on comments I believe.

于 2012-09-13T05:39:41.203 回答