3

更新しました:

この質問に関連するプロジェクトは、この投稿が共有されてから大幅に変更されました。実際には、送信が遅くなるため、画像の送信に TCP ソケットを使用しないことを強くお勧めします。UDP 経由で画像を送信し、RGB を使用する代わりに YUV から JPG に圧縮する問題を修正しました。これにより、画像の各レイヤーを処理する必要がないため、画像の送信と再構築の作業が簡単になります。

画像のサイズを知るには、UDP パケットの最初のバイトにこの情報を追加するだけなので、サイズが適切に受信されない場合、ソケットのタイムアウトによりそのパケットが破棄され、次の UDP を受信したときに通信は引き続き機能します。パケット。

これは元の質問に対する回答ではないため、未回答のままにして、同じ問題を抱えている他の人が解決策を見つけてここに投稿できるようにします。

------------------------ 元の投稿: ----------------------- ----

まず第一に、助けてくれてありがとう、そして私の英語についてお詫び申し上げます。私はスペイン出身です。

ソケットを使用して TCP 経由でコンピューターから画像を受信して​​います。すべての画像について、レイヤー (RGB) の数、各レイヤーの行と列、および各ピクセルの値を取得します。データを収集するには、DataInputStream.

通常は問題なく動作しますが、次の関数で問題を引き起こす行と列の数の値が間違っていることがあります。つまり、送信されないデータを待ってアプリがフリーズしたり、単にデータを保持する配列でインデックス エラーが発生したりすることがあります。 .

DataInputStreamしたがって、行と列の数が多すぎる場合はデータをクリアしたいのですが、ピクセル値の間違ったバイトでいっぱいのをクリアする方法が見つかりません。

DataInputStreamまた、のサイズは次のように計算されるため、わかりませんLayers * Width * height。したがって、このキャンプの実際の値を取得しないと、スキップする必要があるバイト数を知ることができません。

質問:

  1. 誰かが単にクリアする方法を知っていDataInputStreamますか?

  2. そうでない場合、次のような別のタイプの入力方法を使用する必要があり BufferedInputStreamますか?

4

3 に答える 3

1

あなたの問題は、実際には入力ストリームをクリアすることではなく、同期が取れなくなった後に戻ってくることにあると思います。これを行う一般的な方法は、境界パターンを使用することです(マルチパート html ドキュメントおよび mjpeg ストリームで使用されます)。そのため、ストリームで迷子になった場合は、このパターンが見つかるまで検索を続けます。

本当にバイトをスキップしたい場合は、DataInputStream.skipBytes(int n)メソッドを使用できます。

于 2012-06-14T08:26:32.880 に答える
0

は、TCP 接続の両端でJavaDataInputStreamを使用している場合に、プリミティブな Java 型を送受信するために使用するように設計されています。そこからバイトを読み取るだけの場合は、プレーンを使用できます。InputStream

接続の両端が実際に制御下にある場合、より良い方法は、データをオブジェクトにバンドルし、ObjectInputStream. または、画像が標準形式の場合は HTTP。

于 2012-06-14T09:01:10.753 に答える
0

ストリームは、定義上、シーケンシャルにしかアクセスできません。一部のデータをスキップすることは可能ですが、スキップするバイト数を知る必要があります。基本的に、プロトコルが非同期になり、特別なバイト シーケンスまたは同様の方法による同期が許可されない場合、できることはネットワーク接続を閉じて再確立することだけです。

于 2012-06-14T08:27:30.173 に答える