プロが教えるわが家の防犯対策術!

javaのソケット通信の受信で、InputStreamの終了が認識出来ません。


(1)下記のネット上で見つけたチャットクライアントのソース"ChatClient.java"を流用しました。
 http://www.saturn.dti.ne.jp/~npaka/android/Socke …
 チャットサーバもこのサイトのソースを実装しました。この組み合わせで送受信は確認しました。


(2)これを下記のjavaのオープンソースを実装して、バイト読み出しに変更しました。
 ・上記の元のソースの受信ループ中の読み出し部
  size=in.read(w); → size=readsocket(w);

 【"java\io\InputStream.java"より】
  public int read(byte b[]) throws IOException {  //※1
    return read(b, 0, b.length);      //※2
  }
  public int readsocket2(byte b[], int off, int len) throws IOException {//※3
    if (b == null) {
      throw new NullPointerException();
    } else if ((off < 0) || (off > b.length) || (len < 0) ||
        ((off + len) > b.length) || ((off + len) < 0)) {
      throw new IndexOutOfBoundsException();
    } else if (len == 0) {
      return 0;
    }

    int c = read();    //※4
    if (c == -1) {
      return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try {
      for (; i < len ; i++) {
      c = in.read();
      if (c == -1) {
        break;
      }
      if (b != null) {
        b[off + i] = (byte)c;
      }
      }
    } catch (IOException ee) {
    }
    return i;
  }

・上記の名前の付け替え
  ※1:public int readsocket(byte b[]) throws IOException {
  ※2:return readsocket2(b, 0, b.length);
  ※3:public int readsocket2(byte b[], int off, int len) throws IOException {
  ※4:int c = in.read();


(3)この変更を行うと、“in.read()”でストリームの終了の"-1"が入って来ず、forループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?

A 回答 (1件)

投稿されたコードだけでは分からないことがいろいろありますが、Javaのソケットプログラミングはシンプルで標準的な形を守ってください(現状は不必要にややこしすぎる)。


参考書籍:Javaネットワークプログラミングの真髄(ソフトバンククリエイティブ)

この回答への補足

質問が間違っていたので訂正します。

-------------------------------------------------------
※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_さん

掲載ソースは、私が作った訳では無いので、ご指摘に対してどうしようもありません。

宜しくお願いします。

補足日時:2010/06/25 13:28
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/29 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!