SocketChannel.write() в одном потоке, обрабатывающем несколько клиентов
Мое приложение имеет очередь с "исходящими сетевыми пакетами" (POJO с ByteBuffer
и SocketChannel
) внутри, используется одним потоком, который записывает данные в SocketChannel
,
Я делаю это, чтобы гарантировать, что каждый клиент, который должен получать пакеты, получает свою очередь. Это означает, что SocketChannel.write()
пишет последовательно нескольким клиентам (= 1 за один раз).
Может кто-нибудь сказать мне, что может пойти не так, работая так? SocketChannels
созданы из ServerSocketChannel
поэтому они блокируют
Боюсь что write()
операция может заблокировать одного клиента, заставляя других клиентов ждать...
2 ответа
Операция write() действительно может блокироваться в режиме блокировки. Если вы хотите честности и однопоточности, вам придется использовать неблокирующий режим.
Если сокет клиента не может использовать все данные за одну запись (неблокирующую), вы можете закрыть клиент. Это произойдет только при заполнении буфера, так что вы можете увеличить буфер отправки сокета до уровня, при котором вам будет удобно это делать.