Java: Как абстрагироваться между "обычным" TCP-сокетом и SSLSocket - PullRequest
2 голосов
/ 27 января 2020

Редактировать: Удалено startHandshake();, так как оно не имеет отношения к вопросу и редко требуется (например, не в моем случае)

У меня довольно специфический c и редкий клиент-серверный протокол (через TCP ).
Я реализовал это с помощью SSLSocket.
Теперь я предвижу, что мне может понадобиться использовать тот же протокол по незашифрованному соединению.

Моя проблема в том, что класс, реализующий Протокол имеет поле: public SSLSocket currentSocket;
(а затем методы в моем клиентском классе делают все .read(), .write(), flush()...)

Я думал об изменении типа поля, например: public Socket currentSocket;
Однако тогда проблема в том, что моя процедура подключения несовместима:

public static void connect () {
currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
...
  • java. net. Конструктор по умолчанию в .Socket явно не принимает вещи из хранилища ключей

Я не хочу заново реализовывать весь мой клиент только из-за этой разницы ...

  • Одна мысль у меня есть, когда мне нужно Открытый текст Socket, для создания SSLSocket без шифрования.
    Я не знаю, Это профессиональный способ сделать это, или даже если он будет работать (сервер будет ожидать клиентский сокет с открытым текстом в новом случае использования)

  • Моя другая идея состоит в том, чтобы определить два поля, одно для открытого текста - один для сокета SSL, а затем используйте logi c, чтобы при необходимости связать потоки ввода / вывода с правильным полем. Однако это приведет к «зависанию» поля. Если вы используете SSL, появится избыточное поле Socket plaintextSocket и наоборот ...

Есть ли способ сделать мое поле currentSocket более абстрактным, чтобы я мог можете определить его в одном и том же клиенте, а затем указать несколько иной путь кода клиента в зависимости от известной переменной (что-то вроде needSSLsocket=true) для создания экземпляра и соединения?

1 Ответ

2 голосов
/ 28 января 2020

SSLSocket расширяет Socket, поэтому вы можете назначить объект SSLSocket переменной Socket. Вы вправе изменить поле currentSocket на Socket. Просто используйте другую переменную для обработки SSLSocket при необходимости, например:

public static void connect () {
    if (needSSLsocket) {
        SSLSocket ssl = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
        ssl.startHandshake();
        ...
        currentSocket = ssl;

        /* or:
        currentSocket = SslUtils.getSSLsocket(host, port, keystoreFile, keystorePass, pkPass);
        ((SSLSocket) currentSocket).startHandshake();
        ...
        */
    } else {
        currentSocket = new Socket(host, port);
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...