2012-11-21 2 views
1

Im пытается написать «большого» строки (986 символов) от моего сервера к моему клиенту, но я получаю следующую ошибку после прочтения 16 символов:Нетти большая строка, не достаточно читаемого байта

not enough readable bytes - need 2, maximum is 0. 

It работает правильно при отправке меньших строк, но с таким количеством символов эта ошибка возникает.

Мы используем BigEndianHeapChannelBuffer, чтобы получить наши данные.

The obj.length() от записи и buffer.readUnsignedShort() от чтения и дают одинаковый (правильный) номер, но в остальном он выходит из строя в цикле for.

Нетти версия 3.5.10 ЗАВЕРШЕНИЕ

Кто-нибудь имеет какие-либо идеи, как это исправить? Пожалуйста, спросите, нужна ли вам дополнительная информация.

Здесь следуют некоторые фрагменты кода:

WRITING к ручью:

public void addString(String obj) 
{ 
    try 
    { 
    bodystream.writeShort(obj.length()); 
    bodystream.writeChars(obj); 
    System.out.println("Server wrote bytes: " + obj.length()); 
    message = message + ";STRING: " + obj; 
    // bodystream.w(obj); 
    } 
    catch(IOException e) 
    { 
    } 
}  

ЧТЕНИЕ ИЗ ПОТОКА:

public String readString() 
{ 
    try 
    { 
    int len = buffer.readUnsignedShort(); 
    System.out.println("Client can read bytes: " + len); 

    char[] characters = new char[len]; 
    for(int i = 0; i < len; i++) 
     characters[i] = buffer.readChar(); 

    return new String(characters); 
    } 
    catch(Exception e) 
    { 
    System.err.println(e.getMessage()); 
    return ""; 
    } 
} 

РАСШИФРОВКА:

public class NetworkDecoder extends FrameDecoder 
{ 
    @Override 
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) 
    { 
    try 
    { 
     int opcode = buffer.readUnsignedByte(); 
     System.out.println("[In] <- " + opcode); 
     return new ServerMessage(buffer, opcode); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return null; 
    } 
}   
+0

Просто пытаясь рассуждать об этом коде, вы вычисляете длину своей строки как беззнаковый короткий, а затем возвращая его, за которым следует строка, в поток, а затем, когда вы ее читаете, вы берете unsigned short out и определяете, как долго вы будете читать? Как фактор декодирования в этом? –

+0

Не удалось ли это упростить, отбросив длину намек автора и вызов [.toString()] (http://static.netty.io/3.5/api/org/jboss/netty/buffer/AbstractChannelBuffer.html#toString%28java.nio.charset.Charset%29) на ChannelBuffer? –

+0

Хм, это звучит слишком очевидно, чтобы быть правдой. Но я даю ему попробовать. – Myth1c

ответ

0

Вам нужно будет Чтобы убедиться что у вас достаточно данных в буфере, прежде чем передать его на сервер ServerMessage. Также вы хотите вызвать ChannelBuffer.readBytes (..), чтобы «скопировать данные», иначе вы будете всасывать память.

+0

Я собираюсь попробовать пример, приведенный в документации FrameDecoder, для архивирования этого. – Myth1c

 Смежные вопросы

  • Нет связанных вопросов^_^