• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaのソケット通信の受信で、InputStreamの終了が認識出来)

【解決】javaのソケット通信の受信でInputStreamの終了が認識できない問題

このQ&Aのポイント
  • javaのソケット通信の受信でInputStreamの終了が認識できない問題について、元のソースコードからバイト読み出しに変更した際に発生した問題について報告します。
  • 元のソースコードでは、`in.read()`でストリームの終了を判定していましたが、バイト読み出しに変更した場合は`if (c == -1)`の判定が機能しなくなり、受信ループから抜けられなくなります。
  • この問題の原因は、バイト読み出しの場合には`in.read()`が0または1バイトずつしか読み込まれないため、ストリームの終了判定に`-1`が使えないことです。バイト読み出しの場合は、読み込んだバイト数が`-1`になるまでループを続ける必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

投稿されたコードだけでは分からないことがいろいろありますが、Javaのソケットプログラミングはシンプルで標準的な形を守ってください(現状は不必要にややこしすぎる)。 参考書籍:Javaネットワークプログラミングの真髄(ソフトバンククリエイティブ)

palmata
質問者

お礼

InputStreamクラスの"available()"を使う事で、この問題が解決出来ました。

palmata
質問者

補足

質問が間違っていたので訂正します。 ------------------------------------------------------- ※4の下のfor文の中の下記の一行ですが、 c = in.read(); // ※5(←コメント追記) 元々は“c = read(); ”で、実装の際に“c = in.read(); ”と修正した物です。 (3)の文中の“in.read()”"※5"の事になります。 ------------------------------------------------------- このjavaのオープンソース"java\io\InputStream.java"をメソッド名を置き換えて実装すると、 “size=readsocket(w);”でソケット受信しても、抜けて来ません。 要は、入力ストリームをひと固まりで取り込む部分“size=in.read(w); ”を をバイト単位に読み出すように、javaのオープンソースで置き換えたら、 そのメソッドから帰って来なくなったと言う事です。 >ranco_さん 掲載ソースは、私が作った訳では無いので、ご指摘に対してどうしようもありません。 宜しくお願いします。

関連するQ&A

専門家に質問してみよう