Чтение неблокируемого java.nio SocketChannel построчно - PullRequest
1 голос
/ 21 апреля 2019

Я работаю на сервере, который должен будет содержать сотни ожидающих tcp-соединений, каждое из которых очень редко передает / получает реальные данные. Я бы предпочел делать это с сокетами java.nio, основанными не на блокировках / селекторах, а на сотнях блокирующих потоков в моем приложении.

Из java.nio я получаю SocketChannel и сигнал, когда он доступен для чтения. Его метод int .read (ByteBuffer dst) считывает доступное количество байтов в ByteBuffer .

Я ожидаю, что мои клиенты будут отправлять сообщения, по одному сообщению на строку, оканчивающиеся символом \n.

Очевидно, что операция чтения может создавать только части сообщения, завершенные и незавершенные даже нескольких сообщений одновременно. Кроме того, ByteBuffer работает с байтами, а не с символами, поэтому операция чтения может также привести к неполной строке с разделенными символами UTF-8.

Сейчас я ищу способ записи прочитанных байтов в буферную структуру, из которой я затем могу читать завершенные строки, но которая не будет блокироваться, когда символ UTF-8 или строка еще не дошли полностью.

java.io PipedOutputStream / PipedInputStream вместе с InputStreamReader и BufferedReader почти удовлетворяют этим требованиям, но они блокируются в Таким образом, вызов int .read () или String .readLine () в BufferedReader будет блокироваться, если на входе присутствует незавершенный символ или строка UTF-8.

Я сейчас ищу самый чистый Эквивалент, который можно использовать без блокировки. Любая зависимость, Apache Commons или другие сторонние зависимости в порядке.

Вот базовый пример неблокирующего сервера для начала работы: https://gist.github.com/MaZderMind/12fe3b370e654f31ea22aaa540f5a741

...