Java NIO SocketChannel считывает заранее определенное количество байтов

У меня есть сервер сокетов Java NIO.

Сервер получает JSONObjects от удаленных клиентов. я использую метод SocketChannel.read(ByteBuffer) для чтения с канала. каждое сообщение заканчивается символом '\n', который отмечает конец текущего сообщения.

моя проблема в том, что иногда метод read() считывает больше байтов и достигает после «\ n».. есть ли способ для меня читать из SocketChannel только до тех пор, пока не будет найден «\ n»? я думал о том, может быть, байт за байтом прочитан (я просто не мог найти документы о том, как это реализовать ..)?

любые другие решения?


person Asaf Nevo    schedule 23.12.2012    source источник


Ответы (1)


Обработайте байты из вашего ByteBuffer до '\n' включительно, чтобы позиция буфера была первым байтом после '\n', затем вызовите ByteBuffer.compact(). Любые байты, которые были за '\n', останутся в буфере, и следующее чтение будет добавлено к ним.

person VGR    schedule 24.12.2012
comment
это неплохая идея, но я подумал о том, чтобы оставить внутри SocketChannel оставшиеся данные для чтения, поэтому селектор обнаружит, что это новые сообщения для чтения позже.. это важно, потому что механизм моего сервера таков, что для каждого сообщения - поток из пула потоков будет выполняться - person Asaf Nevo; 24.12.2012
comment
Для этого вам, вероятно, придется, как вы предложили, читать по одному байту за раз, что, я думаю, не будет иметь хорошей производительности. Я думаю, что вместо того, чтобы полагаться на читаемость SelectionKey, чтобы знать, когда у вас есть сообщение, вам нужно будет искать '\ n' в буфере после каждого чтения. Что вам, вероятно, все равно приходилось делать, поскольку при массовом чтении никогда не гарантируется чтение всей строки за один вызов (и даже может быть прочитано более одной строки). - person VGR; 24.12.2012