Неблокирующий сокет пишет на Java против блокирующий сокет пишет

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

2 ответов


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

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

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


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

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

или

// blocking write
sc.write(bb);

первый может записать CPU, а второй может быть более желательным.

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