Редактировать: Удалено 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
) для создания экземпляра и соединения?