Почему опция записи SSLSocket не имеет тайм-аута? - PullRequest
0 голосов
/ 22 мая 2018

В Java операция записи в SSLSocket API блокируется, и операция записи также не поддерживает время ожидания.

Может кто-нибудь объяснить, пожалуйста?

  1. Может ли быть ситуация, когда записьоперация может навсегда заблокировать поток?Я проверил в Интернете, и кажется, что есть возможность блокировки навсегда.
  2. Как добавить тайм-аут для операции записи?

Мое приложение создает два потока, один для чтения и один длянаписать.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Потому что:

  1. Если такая возможность вообще нужна, она нужна на уровне TCP, а не только на уровне SSL.
  2. Для этого нет APIуровень TCP, и я имею в виду не только Java: для него также нет API уровня C, за исключением, может быть, на нескольких платформах.
  3. Если вы добавили его на уровне SSL, тайм-аут записисобытие оставило бы соединение в неопределенном состоянии, что означало бы, что оно должно быть закрыто, потому что вы не могли знать, сколько данных было передано, и вы не могли поддерживать целостность на уровне SSL.

Чтобы ответить на ваши конкретные вопросы:

  1. Может ли быть ситуация, когда операция записи может навсегда заблокировать поток?Я проверил в интернете, и кажется, что есть возможность блокировки навсегда.

Да.Я видел приложение, заблокированное в течение нескольких дней в такой ситуации.Хотя нет, как правильно говорит @StephenC, навсегда.Мы еще не жили так долго.

Как добавить время ожидания для операции записи?

Вы можете сделать это на уровне TCP с неблокирующим вводом / выводом и Selector, а также можете наложить слой SSLEngine вдобавок к этому, чтобы получить SSL, но это утомительное и очень подверженное ошибкам упражнение, которое многие пытались: немногие преуспели.Не для слабонервных.

0 голосов
/ 22 мая 2018

1- Может ли быть ситуация, когда операция записи может навсегда заблокировать поток?Я проверил в интернете, и кажется, что есть возможность блокировки навсегда.

Да, может.Хотя не буквально навсегда: -)

2- Может кто-нибудь предложить, как мы можем добавить время ожидания для операции записи?

Вы не можете сделать это с помощью реализации сокетов / в Java.SSL-сокеты и так далее.Сокеты Java поддерживают время ожидания соединения и время ожидания чтения, но не время ожидания записи.

См. Также: Как настроить тайм-аут записи сокета в Java?

(Почему? Хорошо запись в сокетТайм-ауты были запрошены в идентификаторе ошибки JDK-4031100 еще в 1997 году, но ошибка была закрыта со статусом "WontFix". Прочитайте ссылку для подробностей.)

Альтернативы включают:

  1. Используйте таймер для реализации тайм-аута и прерывайте поток или закрывайте сокет, если таймер отключается.Обратите внимание, что как прерывание, так и закрытие приведут вас в состояние, в котором вам необходимо покинуть сокет.

  2. Используйте селекторы NIO и неблокирующие входы / выходы.

...