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 に答える