Неблокирующая запись в сокет в Java по сравнению с блокирующей записью в сокет - PullRequest
6 голосов
/ 11 ноября 2011

Почему кто-то предпочел бы блокирующие записи неблокирующим? Насколько я понимаю, вы захотите блокировать запись только в том случае, если хотите убедиться, что другая сторона получила TCP-пакет после возвращения метода записи, но я даже не уверен, что это возможно. Вы должны были бы очистить, а очистить пришлось бы очистить базовый буфер сокета записи операционной системы . Так есть ли какой-нибудь недостаток неблокирующей записи в сокет? Является ли наличие большого базового буфера сокета записи плохой идеей с точки зрения производительности? Насколько я понимаю, чем меньше базовый буфер записи сокета, тем больше вероятность, что вы столкнетесь с медленным / ошибочным клиентом и вам придется отбрасывать / ставить в очередь пакеты на уровне приложения, пока базовый буфер сокета заполнен и isWritable () возвращает false.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2011

Насколько я понимаю, вы хотели бы блокировать запись только в том случае, если хотите убедиться, что другая сторона получила TCP-пакет после возврата метода записи

Ваше понимание неверно. Это не гарантирует этого.

Блокировка записи блокирует, пока все данные не будут переданы в буфер отправки сокета, откуда они будут асинхронно переданы в сеть. Если читатель работает медленно, его буфер приема сокета заполнится, что в конечном итоге приведет к заполнению буфера отправки сокета, что приведет к блокировке записи в блок, блокирующему весь поток. Неблокирующий ввод / вывод дает вам возможность обнаружить и обработать эту ситуацию.

3 голосов
/ 11 ноября 2011

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

// non-blocking write
while(bb.remaining() > 0) sc.write(bb);

OR

// blocking write
sc.write(bb);

Первый может сжечь процессор, а второй может быть более желательным.

Большая проблема - чтение. Как только вы решите, хотите ли вы блокирующее или неблокирующее чтение, ваши записи должны быть одинаковыми. К сожалению, нет никакого способа сделать их другими. Если вы хотите неблокирующее чтение, вы должны иметь неблокирующее чтение.

...