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;
}
}
Просто пытаясь рассуждать об этом коде, вы вычисляете длину своей строки как беззнаковый короткий, а затем возвращая его, за которым следует строка, в поток, а затем, когда вы ее читаете, вы берете unsigned short out и определяете, как долго вы будете читать? Как фактор декодирования в этом? –
Не удалось ли это упростить, отбросив длину намек автора и вызов [.toString()] (http://static.netty.io/3.5/api/org/jboss/netty/buffer/AbstractChannelBuffer.html#toString%28java.nio.charset.Charset%29) на ChannelBuffer? –
Хм, это звучит слишком очевидно, чтобы быть правдой. Но я даю ему попробовать. – Myth1c