0

我正在编写一个使用 sshj 库进行 SSH 连接的应用程序。用户从菜单打开连接对话框,输入登录数据并单击连接按钮建立连接。然后用户从不同的面板和框架执行各种操作。我的问题是:在用户单击“断开连接”按钮之前,我应该在哪里保持此连接以使其可用于需要它的每个面板和框架?我考虑过一些自定义类中的静态字段,但我不相信这样做。你有什么想法?

4

3 回答 3

1

听起来您对某种类型的游泳池感兴趣。

你可以用不同的方式做到这一点。一种方法是拥有一个处理所有连接的类,这是一个单例。然后,您只需向池请求连接,例如

SSHConnection con = ConnectionPool.getConnection(host, port);

您也可以为此使用代理。在代理中,您实际上得到的是一个占位符,而不是实际的连接。代理与其他实例共享信息,有点像

class ConnectionProxy {
    private static SSHConnection connection;
}

connection 变量是共享的,当你创建一个新的 ConnectionProxy 时,你实际上会得到旧的连接,但看起来你得到了一个新的连接。

另一种选择是简单地将实例传递给所有需要它的类。这将允许您跟踪谁做了什么,但您将失去从任何地方获取连接的灵活性。

但是,如果您正在调试,传递一个实例会有所帮助,请这样想。你在一个拥挤的房间里,你有一些钱放在一个需要钥匙才能打开的盒子里。如果你把钥匙交给一个人(需要它的班级),然后离开房间然后回来,钱没了,你可以责怪那个人。相反,如果您只是将钥匙留在盒子旁边的桌子上(实例是全局的)并离开房间,然后回来,钱就没有了,那么祝您好运,找出是谁拿走了它。

参考:
*]代理模式 - 维基百科


代理示例

更具体地说,它可能看起来像这样:

public class ConnectionProxy implements Connectable {

    // where Connectable is some shared interface between ConnectionProxy
    // and SSHConnection. The proxy should "look like" a connection, it just
    // hides the actual connection behind the scenes.

    private static SSHConnection connection;

    public ConnectionProxy() { }

    public ConnectionProxy(String host, int port) {
        connection = new SSHConnection(host, port);
    }

    public void connect(String host, int port) {
        if (isConnected()) {
            return;
        }
        connection = new SSHConnection(host, port);
    }

    public void reconnect() {
        connection = new SSHConnection(connection.getHost(), connection.getPort());
    }

    public boolean isConnected() {
        return connection != null && connection.isConnected();
    }
}

您可以通过实例化它或连接它来使用该类。

class Program {
    public void sendMessage() {
        ConnectionProxy proxy = new ConnectionProxy();
        if (!proxy.isConnected()) {
            // I guess noone connected it
            return;
        }
        proxy.sendBytes();
    }
 }

并在您的连接对话框中实例化或连接 ConnectionProxy。您可以添加对多个连接的支持,即不同的主机和端口,只需将变量连接改为列表,然后检查主机和端口是否有正确的连接。您基本上创建了一个连接池,但对于客户端类来说,它看起来像是在创建连接。

于 2011-10-28T00:39:04.610 回答
0

不管你把它放在哪里,只要你提供一个getter检索它的方法,那个获取方法就是public.

我认为这更多的是它在逻辑上属于哪里的问题。如果它是应用程序的属性(而不是窗口、框架、配置文件等),则将 getter 放在主应用程序类中。

于 2011-10-28T00:36:58.753 回答
0

在设计方面,我建议将您可以通过 SSH 执行的操作包装在一个单独的类(RemoteCommands或类似的类)中,并在您需要执行远程命令的任何地方注入(设置为属性)该类的一个实例。

如果这看起来像很多额外的样板代码,因为每个框架和面板都需要它,那么这不应该对你说“我需要一个全局变量”。它应该说“我应该减少直接执行远程命令的组件的数量”。

于 2011-10-28T00:41:25.810 回答