Разъем.Пакеты остаются в очереди, когда они мне нужны - PullRequest
1 голос
/ 22 марта 2012

У меня странная проблема с получением данных из сокета.На клиенте я использую воздушную розетку.На сервере нетва.Я пишу в сокет простые пакеты: int numPacket, int textLength, utf8String text.И читать на клиенте.

//server
buffer.writeInt( packetId );
ChannelBuffer ch = ChannelBuffers.copiedBuffer( text, CharsetUtil.UTF_8);
buffer.writeInt( text.length() );
buffer.writeBytes(ch);

//client
packetId = socket.readInt()
packetLen = socket.readInt()
text = socket.readUtfBytes(packetLen)

Иногда один пакет () не получает клиент, но сервер был отправлен туда, и tcpdump показывает, что пакет был отправлен.Если сервер отправляет новый пакет, клиент читает предыдущий пакет и не получает новый пакет - и это работает как очередь, которая мне не нужна.извините за плохой английский -_-

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Похоже, клиент, возможно, ждет некоторого байта \n, \u и т. Д., Чтобы узнать конец кадра. У меня была похожая проблема со вспышкой, потому что клиент ожидал null byte в конце передачи.

Вы можете попробовать добавить следующий тип encoder в качестве последнего кодировщика в вашем конвейере и попробовать. Соответствующий код для обработки нулевого байта показан ниже.

    ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 });
    ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer);
0 голосов
/ 22 марта 2012

Попробуйте использовать flush () в буфере после каждой или всех трех

...