Я пытаюсь написать клиент и сервер Websockets.Первоначально это HTTP-соединение, а Websockets Handshake использует HTTP-заголовки, чтобы указать, что для подключения необходимо обновить новый протокол.
Я хочу прочитать набор HTTP-заголовков из SocketChannel и, еслиуказано обновление, переключитесь на другую библиотеку для обработки веб-сокетов и с этого момента обрабатывайте потоки SocketChannel совершенно по-разному, как набор кадров, а не строк, разделенных \ r \ n.
Я знаю, что могучитать произвольное количество байтов в ByteBuffer, но кадр Websockets мог быть отправлен с рукопожатием, и я не хочу выделять частично использованные буферы между этими разделами кода.То, что я хочу, это читать из сокета только данные до и включая последовательность "\ r \ n \ r \ n".Любые данные, которые я хочу оставить во входном потоке объекта SocketChannel.
Каков рекомендуемый способ сделать это?Получить поток ввода из SocketChannel и обернуть его в буфере чтения?Будет ли это правильно взаимодействовать с NIO, особенно с неблокирующим использованием?Могу ли я удалить буферизованный считыватель из входного потока, как только будет обнаружена пустая строка, и при этом все данные кадра доступны при передаче канала к коду Websockets?
Или, возможно, мне нужно читать побайтовобайт (или 4-байтовые чанки с меньшими буферами, если некоторые из целевых символов "\ r \ n \ r \ n" появляются в конце чанка) и таким образом создают строки моего заголовка.
Или, может бытьнекоторая комбинация манипулирования меткой, лимитом и позицией позволила бы входному потоку вернуть данные, которые он ранее считал в ByteBuffer, при условии, что буфер был выделен напрямую.
Любая рекомендация будет принята с благодарностью.