1

我试图从我的服务器向我的客户端写入一个“大”字符串(986 个字符),但在读取 16 个字符后出现以下错误:

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

它在发送较小的字符串时可以正常工作,但是对于这么多的字符会引发此错误。

我们使用BigEndianHeapChannelBuffer来接收我们的数据。

write 的 obj.length() 和 read 的 buffer.readUnsignedShort() 都给出了相同的(正确的)数字,但其余的它在 for 循环中崩溃。

Netty 版本是 3.5.10 FINAL

有人知道如何解决这个问题吗?请询问您是否需要更多信息。

以下是一些代码片段:

写信给流:

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;
  }
}        
4

1 回答 1

0

在将缓冲区传递给 ServerMessage 之前,您需要确保缓冲区中有足够的数据。您还想调用 ChannelBuffer.readBytes(..) 来“复制数据,否则会占用内存。

于 2012-11-22T19:58:12.400 回答