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ループから抜けなくなってしまいました。帰って来るのは送信したコードのみです。どこが悪いのでしょうか?
No.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_さん
掲載ソースは、私が作った訳では無いので、ご指摘に対してどうしようもありません。
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaでcsvファイル読込時の改行...
-
式の型は配列型で int に解決済...
-
C++からC#のdllを参照する際、...
-
JAVAでCの関数ポインタのような...
-
共有メモリについて
-
「配列定数は、イニシャライザ...
-
コード中の謎のエラー
-
C#での画像ファイルをドラッグ...
-
javaでカレンダー作成
-
ビープ音をなめらかに鳴らしたい
-
java spring でエラーが出て困...
-
java 長さの異なる配列の代入
-
JAVA EOFの検出 (条件文で「...
-
SwingでJtableのヘッダ行が表示...
-
Java 初心者 int型の取り扱い方
-
後置インクリメントの計算過程...
-
二分探索木で例えば1〜10の値を...
-
sin曲線とcos曲線を描くプログ...
-
byte[2] から int へ。
-
intが負の時に投げる例外はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
DataSet(DataTable)の使い方
-
「配列定数は、イニシャライザ...
-
JUnit4のアノテーションについて
-
C#で実行時にメソッドの返り値...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
c# デリゲート関連の命名について
-
java streamでenum配列への変換
-
intが負の時に投げる例外はあり...
-
Java 初心者 int型の取り扱い方
-
C++からC#のdllを参照する際、...
-
アンマネージDLLで、ダイアログ...
-
【C#】フォームをなめらかに移動
-
(Swing)JTextFieldを半角のみ入...
-
Javaで簡単なアニメーションを...
-
javaのエラーの意味がわかりま...
-
C#で判断文(三択)の省略形は...
-
共有メモリについて
おすすめ情報