Работа с фрагментацией в Netty - PullRequest
1 голос
/ 18 января 2012

Я разрабатываю двоичный протокол для связи клиент / сервер с использованием Netty, и количество отправленных байтов не является фиксированным и может иметь произвольный размер.

Клиент отправляет что-то вроде этого:

первые 4 байта для представления идентификатора остальные байты - это строка

В примере, который я видел, сообщение имело фиксированный размер, но содержимое String могло иметь любой размер и должно гарантировать, что оно не фрагментируется при получении сервером. Как бы я достиг этого в Netty?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Как вы определяете конец сообщения?Ноль?Я бы проверил декодер воспроизведения Netty:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html

Это облегчает вам задачу.Просто продолжайте читать, пока не найдете ноль.Если у вас заканчиваются байты до того, как вы достигнете нуля, будет выдано исключение для выхода из метода декодирования.Когда доступно больше байтов, метод декодирования будет вызван снова с существующими байтами и новыми байтами, объединенными в одном ChannelBuffer.

Этот цикл может повторяться до тех пор, пока у вас не появится все сообщение в ChannelBuffer ... которое затем вы можете передать на следующий уровень для обработки.

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

1 голос
/ 19 января 2012

Или, если он основан на строке, вы можете просто использовать DelimiterBasedFrameDecoder для этой работы.

См .: http://netty.io/docs/stable/api/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.html

...