初心者にありがちなBUG
ストリームからデータを受信するとき。
byte buf[] = new buf[SIZE]; inputStream.read(buf, 0, buf.length); :
プログラムを書いた人は、第3引数で受信データサイズを指定しているので、必ずそれだけ受信できると思っている(第1引数は格納先バッファ、第2引数は格納開始オフセット)。しかし実際は要求したサイズ以下のデータしか受信できないこともある。
プログラムを書いた人は期待したデータを受け取っていると思っている。しかし、ストリームにはまだデータが残っている。次回以降の受信でデータが壊れていると錯覚する。先頭にある余計なデータは誰が送信したのだろうか、と悩むことになる。
この問題を解消するには、(例えば)以下のように書かなければならない。
byte buf[] = new buf[SIZE]; int receiveddSize = 0; while (receivedSize < buf.length) { int len = inputStream.read(buf, receivedSize, buf.length - receivedSize); receivedSize += len; }
# 最近、これが原因ではまっていた人がいたらしい。
んで、今日の夕方、ある人から電話があった。JPEG画像をHTTPで受信してファイルに書いているのだが、JPEGデータの後ろの方が切れてしまい、画像の下の部分が壊れているそうな。
ネットワーク上には完全なデータが流れているのが確認できているそうなので、上に書いた受信ロジックのミスではないかと踏んでいる。
電話では要求したサイズに満たないデータしか受信できないこと可能性があることを伝えたつもりだけど、解決できたのかなぁ。。。