1

私のプログラムでは、pc が Android フォンに継続的にデータを送信します。毎回 pc は 62 バイト (ヘッド用に 24 バイト、コンテンツ用に 38 バイト) を送信します。私のプログラムはうまく動きます。しかし、私の電話では、ヘッドが 24 バイト、コンテンツが 10 バイトしか読み取れないことがあります。

非ブロック ソケットチャネル経由でデータを受信します。

private SocketChannel client = null;

    public int read(byte[] data,int offset, int len){
    try {
        ByteBuffer buffer = ByteBuffer.allocate(len);
        int read_len = client.read(buffer);
        if(read_len == 0){
        }else if(read_len == -1){
        }else{
            buffer.flip();
            buffer.get(data, offset, read_len);
        }
        return read_len;

    } catch (IOException e) {
        e.printStackTrace();
    }
    return -2;
}

どうすればこの問題を解決できますか?

4

1 に答える 1

1

しかし、時々私の電話はヘッド用に24バイト、コンテンツ用に10バイトしか読み取れません。

ネットワークに問題がある可能性はありますが、TCPはメッセージ境界を保持しないストリーム指向のプロトコルであるため、PCから送信されたバイトに対応しないペイロードを取得することがあると思います。これはOKであり、期待されています。それはあなたがもう少し仕事をしなければならないことを意味します。

あなたのreadメッセージでは、提供されたバイト配列を満たすのに十分なデータが得られるまでデータを読み続けたいと思います。これを試してみてください:

   public int read(byte[] data, int offset, int len)
   {
      try
      {
         ByteBuffer buffer = ByteBuffer.allocate(len - offset);
         while (buffer.hasRemaining())
         {
            int read_len = client.read(buffer);
            if (read_len == -1)
               return -1;
         }
         buffer.flip();
         int result = buffer.remaining();
         buffer.get(data, offset, buffer.remaining());
         return result;
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
      return -2;
   }

バイトバッファへの読み取りの良い点は、複数の読み取りでバイトを正しく連結する処理を行うため、いっぱいになるまでループするだけです。

ところで-バッファの長さからオフセット(ゼロ以外の場合)を減算することを忘れないでください。

于 2012-12-11T03:49:06.743 に答える