Как сохранить доступное соединение SSH? - PullRequest
0 голосов
/ 28 октября 2011

Я пишу приложение, которое использует библиотеку sshj для SSH-соединений. Пользователь открывает Connect Dialog из меню, вводит данные для входа и нажимает кнопку Connect, чтобы установить соединение. Затем пользователь выполняет различные операции с разных панелей и фреймов. Мой вопрос: где я должен сохранить это соединение, чтобы сделать его доступным для каждой панели и фрейма, которые в нем нуждаются, пока пользователь не нажмет кнопку Отключить? Я думал о статическом поле в каком-то пользовательском классе, но я не убежден в этом. Какие у тебя идеи?

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Похоже, вы заинтересованы в каком-то типе пула.

Вы можете сделать это по-разному. Одним из способов является создание класса, который обрабатывает все соединения, который является одноэлементным. Затем вы просто запрашиваете у пула соединение, например

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

Вы также можете использовать прокси для этого. В прокси вы фактически получаете заполнитель вместо фактического соединения. Прокси-сервер делится информацией с другими экземплярами, вроде

class ConnectionProxy {
    private static SSHConnection connection;
}

переменная соединения является общей, и когда вы создаете новый ConnectionProxy, вы фактически получаете старое соединение, но похоже, что вы получаете новое соединение.

Другой вариант - просто передать экземпляр всем нуждающимся классам. Это позволит вам отслеживать, кто что делает, но при этом вы потеряете гибкость, позволяющую получить соединение откуда угодно.

Передача экземпляра поможет, если вы отлаживаете, подумайте об этом так. Вы находитесь в переполненной комнате, и у вас в ящике лежат деньги, для открытия которых нужен ключ. Если вы передадите этот ключ одному человеку (нуждающемуся в нем классу), выйдете из комнаты и вернетесь, а деньги уйдут, вы можете обвинить этого человека. Если вместо этого вы просто оставите ключ на столе рядом с коробкой (экземпляр является глобальным) и выйдете из комнаты, вернетесь и деньги исчезнут, тогда удачи вам выяснить, кто их забрал.

Ссылки:
*] Шаблон прокси - 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 или подключаете его. Вы можете добавить поддержку нескольких соединений, то есть разных хостов и портов, просто сделав вместо этого переменное соединение списком и проверив правильность соединения для хоста и порта. Вы в основном создаете пул соединений, но для клиентского класса это выглядит так, как будто оно создает соединение.

0 голосов
/ 28 октября 2011

При разработке я бы порекомендовал обернуть операции, которые вы можете выполнять над SSH, в отдельный класс (RemoteCommands или около того) и внедрить (задавать в качестве свойства) экземпляр этого класса везде, где вам нужно выполнитьудаленная команда от.

Если это кажется большим количеством дополнительного шаблонного кода, потому что он нужен каждому отдельному кадру и панели, это не должно означать «мне нужна глобальная переменная».Должно быть сказано: «Я должен уменьшить количество компонентов, которые непосредственно выполняют удаленные команды».

0 голосов
/ 28 октября 2011

Неважно, куда вы положили его, если вы предоставляете метод getter для его извлечения, и этот метод получения public.

Я думаю, что это больше вопрос, гделогически принадлежит.Если это свойство приложения (в отличие от окна, фрейма, профиля и т. Д.), Поместите метод получения в основной класс приложения.

...