0

SSH接続にsshjライブラリを使用するアプリケーションを作成しています。ユーザーはメニューから[接続]ダイアログを開き、ログインデータを入力し、[接続]ボタンをクリックして接続を確立します。次に、ユーザーはさまざまなパネルやフレームからさまざまな操作を実行します。私の質問は、ユーザーが[切断]ボタンをクリックするまで、この接続を必要とするすべてのパネルとフレームで使用できるようにするには、この接続をどこに保持する必要があるかということです。いくつかのカスタムクラスで静的フィールドについて考えましたが、そうすることを確信していません。あなたの考えは何ですか?

4

3 に答える 3

1

ある種のプールに興味があるようですね。

これはさまざまな方法で行うことができます。1つの方法は、すべての接続を処理するクラスを持つことです。これは、一種のシングルトンです。次に、たとえば、プールに接続を要求するだけです。

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

これにはプロキシを使用することもできます。プロキシでは、実際の接続ではなく、実際にプレースホルダーを取得します。プロキシは他のインスタンスと情報を共有します。

class ConnectionProxy {
    private static SSHConnection connection;
}

接続変数は共有されており、新しいConnectionProxyを作成すると、実際には古い接続が取得されますが、新しい接続が取得されているように見えます。

もう1つのオプションは、インスタンスを必要とするすべてのクラスにインスタンスを渡すことです。これにより、誰が何をしたかを追跡できますが、必要な場所から接続を取得する柔軟性が失われます。

ただし、デバッグしている場合は、インスタンスを渡すと役立ちます。次のように考えてください。あなたは混雑した部屋にいて、開くために鍵が必要な箱にいくらかのお金を置いています。その鍵を1人の人(それを必要とするクラス)に渡して部屋を出て戻ってきてお金がなくなった場合、その人のせいにすることができます。代わりに、ボックスの横のテーブルにキーを置いたままにして(インスタンスはグローバルです)、部屋を出て、戻ってきてお金がなくなった場合は、誰がそれを受け取ったかを調べてください。

参照:
*]プロキシパターン-WikiPedia


プロキシの例

具体的には、次のようになります。

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

それは論理的にどこに属するのかという問題だと思います。それがアプリケーションのプロパティである場合(ウィンドウ、フレーム、プロファイルなどではなく)、ゲッターをメインアプリケーションクラスに配置します。

于 2011-10-28T00:36:58.753 に答える
0

設計的には、SSHを介して実行できる操作を別のクラス(RemoteCommandsまたはそのようなもの)にラップし、リモートコマンドを実行する必要があるすべての場所にこのクラスのインスタンスを挿入(プロパティとして設定)することをお勧めします。

すべてのフレームとパネルがそれを必要とするためにこれが多くの余分な定型コードのように思われる場合、これはあなたに「グローバル変数が必要です」と言うべきではありません。「リモートコマンドを直接実行するコンポーネントの数を減らす必要があります」と表示されます。

于 2011-10-28T00:41:25.810 に答える