SocketChannel.write () в одном потоке, обрабатывающем несколько клиентов - PullRequest
0 голосов
/ 10 ноября 2011

мое приложение имеет очередь с "исходящими сетевыми пакетами" (POJO с ByteBuffer и SocketChannel) внутри, которая используется одним потоком, который записывает данные в SocketChannel.

Я делаю это, чтобы гарантировать, что каждый клиент, который должен получать пакеты, получает свою очередь.Это означает, что SocketChannel.write() пишет последовательно нескольким клиентам (= 1 одновременно).

Может кто-нибудь сказать мне, что может пойти не так, работая так?SocketChannels создаются из ServerSocketChannel, поэтому они блокируются.

Боюсь, что операция write() может заблокировать 1 клиента, что заставит других клиентов ждать ...

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Операция write () действительно может блокироваться в режиме блокировки. Если вы хотите честности и однопоточности, вам придется использовать неблокирующий режим.

0 голосов
/ 10 ноября 2011

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

...