Изменить: удалено startHandshake();
, так как оно не имеет отношения к вопросу и редко требуется (например, не в моем случае)
У меня есть довольно специфический и редкий протокол клиент-сервер (через 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 явно не принимает материалы хранилища ключей
Я не хочу переделывать весь клиент только из-за этой разницы...
У меня есть одна мысль: когда мне нужен сокет с открытым текстом, создать SSLSocket без шифрования.
Я не знаю, является ли это профессиональным способом и будет ли он вообще работать (сервер будет ожидать открытый текст). клиентский сокет в новом варианте использования)Моя другая идея состоит в том, чтобы определить два поля, одно для сокета с открытым текстом, одно для сокета SSL, а затем использовать логику для связывания входящих/исходящих потоков с правильным полем по мере необходимости. Однако это приведет к «висячему» полю. Если вы используете SSL, будет лишнее поле
Socket plaintextSocket
и наоборот...
Есть ли способ сделать мое поле currentSocket
более абстрактным, чтобы я мог определить его в том же клиенте, а затем указать немного другой путь кода клиента в зависимости от известной переменной (что-то вроде needSSLsocket=true
) для создания экземпляра и подключения?
startHandshake()
. Вы должны быть в состоянии написать все свое приложение с точки зренияSocket
, кроме того, что происходит в фабричном методе, если только вы не делаете причудливые вещи, такие как аннулирование сеанса или повторное подтверждение. - person user207421   schedule 28.01.2020startHandshake()
вызывается автоматически при первом вводе/выводе в/из сокета. Вы не должны называть это сами. Вам нужно вызывать его только тогда, когда вы хотите изменить сеанс. - person user207421   schedule 29.01.2020