• ベストアンサー

戻り値の返し方

java eclipseを使ってプログラミングを勉強しています。 通信のプログラムを作っているのですが、 データをwrite()メソッドやread()メソッドを使って 送受信するのですが、それらのメソッドが正常に動いたかの 確認をする必要があると考えました。 そのためには、戻り値を確認すればよいことが分かりました。 初歩的な質問で申し訳ないですが、どうやって戻り値を 確認すればよいでしょうか? アドバイスをお願いします。

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

  • ベストアンサー
  • henagisan
  • ベストアンサー率100% (2/2)
回答No.1

質問が抽象的なので具体的にするともっと回答しやすくなると思います。 質問の意図に沿っているかわかりませんが、メソッドの戻り値を確認する方法だけお答えします。 read()の戻り値は「読み込まれた文字数」をintで返します。 ストリームの終端に達し、読み込める文字がなくなった場合「-1」を返します。 たとえばreader.read()というようにメソッドを呼び出した場合、 reader.read()自身が読み込んだ文字数を表します。 たとえば以下のように記述します。 if(reader.read() == -1){    System.out.println("もう読み込めません"); } write()は返り値が無いため、確認することは出来ないと思います。 基本的に入出力ではtry catchを用いてエラー処理をするので、正常に動かなかった場合はcatch(){}のなかで処理をすればいいです。 最後に、もしソケット通信を行っているなら以下のページが参考になるかと思います。read()やwrite()すら使わなくてかけます。 http://www.hellohiro.com/socket.htm http://ysserve.int-univ.com/sugsi/Lecture/java/L5/05-03-02.html

debukawa
質問者

お礼

回答ありがとうございます。 具体的に書きます。 for (int i = 0; i < data-2; i++) {   out.write(i); } out.write('\\'); out.write('s'); out.flush(); out.write('\\'); out.write('q'); out.flush(); という処理を行うのですが、本当にdata-2が書き込まれて送信されたのか、 また、 while ((ch = in.read()) != -1) {   if (stat == STATUS_RST) {    startNs = System.nanoTime();    stat = STATUS_RCV;   }   if (stat == STATUS_RCV && ch == '\\') {    stat = STATUS_CMD;   } else if (stat == STATUS_CMD) {    if (ch == 's') {     long Ns = System.nanoTime() - startNs;     long Micros = Ns / 1000;     out.println(Micros);     System.out.println("計測時間:" + Micros + " (マイクロ秒)");     stat = STATUS_RST;    } else if (ch == 'q') {     break;    } else {     stat = STATUS_RCV;   }  } } この処理で本当に送信されたバイト数が受信されたのかを 戻り値を使って確認したいのです。 >read()の戻り値は「読み込まれた文字数」をintで返します。 >ストリームの終端に達し、読み込める文字がなくなった場合「-1」を返します。 ということは、戻り値をチェックすれば、現在何バイト読み込んだかが 確認できるということでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.3

まず一点訂正です。 >4 x 115 + 1バイトまでで受信側が計測を終了してしまうような。 APIリファレンスの記載に疑問を感じ挙動を確認したところ、4 x 115 + 1 ではなく 115 + 1 のようです。write(int) は引数はintなのにbyteとして送信するのですね。失礼致しました。 が、いずれにしてもご提示頂いたコードで10000バイトのデータを送信できないことに変わりはありません。 > ということは、次のようにすればよいですか? そうです。以前もお願いしましたが、聞き返す前にご自身で確認して頂けませんか? 確認のためだけに再度回答を求められるのは困ります。 > fulsh()で送信されるということですよね? > outというバッファの中にforのなかの処理で作られたバイトデータを格納して、fulsh()で送信していると考えています。 flush()を呼ぶとバッファリングされていたデータが強制的に出力ストリームに書き出されます。おおまかな解釈は合っていると思いますが、そこまで分かっていてあと何を知りたいのでしょうか。結局私の「flush()の挙動を疑っているのか」という問いに戻ってしまうように思います。やりとりが大変そうなのでこの件の回答は保留とさせて頂きます。 > forの中の処理で、次のようなデータを作ろうとしています。 > 012345678...9999s この例から察するに、送信側が out.write(9999) としたら受信側は "9999"という4文字の文字列として認識するとお考えですか? それとも '9999' という文字が存在すると思っているのでしょうか? いずれも不正解です。 試しに送信側のforループとwrite()を全部コメントアウトして、代わりに write(116) を実行してみてください。その後でwrite('t')に変えて実行してみてください。その結果がなぜそうなるのか人に説明できないようでしたら、「アスキーコード」で検索してみてください。これは「なぜ115 + 1バイトで受信が終了するのか」の間接的な回答にもなります。 このあたりはプログラミングというより、コンピュータの基礎知識に相当する内容です。最初の質問である「戻り値」の件や、以前からのご質問もそうですが、ナノスケールの時間測定という高度なことに挑戦するにしては質問が初歩的すぎると感じます。コーディングを見てもナノスケールにこだわるにしては正直レベルが低いです。お急ぎの理由があるのかもしれませんが、コンピュータ/プログラミング/通信の基礎といった本を読んで、先に基礎をきっちり抑えておかないと厳しいと思いますよ。

debukawa
質問者

お礼

回答ありがとうございます。 おっしゃるとおりです。自分のレベルとやっていることがあっていないですよね。不愉快な気持ちにさせてしまい、申し訳ありません。 私はjavaはまだ半年ほどしか勉強していません。それも、独学です。 詳細を書くと、特定されるのでかけないですが、ある事情で高いレベルの作業をしています。 先生は質問しても返事をしてくれませんので、頼るところがネットしか ありません。たくさんサイトを見ますが、初心者ですので満足に理解できません。 期限までに時間がないので、わらにもすがる思いで質問しています。 なんとかして完成させないと、4月から職なしになってしまいます。 こんなことは、komi1341さんには何の関係もないので無視していただいて結構です。 ただ、自分で考えるのが面倒だからとか、そういう理由で質問させていただいていたのではないです。 長々と書いてしまいました。 自分でもできる限り勉強しますが、それでもできないときは、また質問させていただきますので、よろしければアドバイスをお願いします。

すると、全ての回答が全文表示されます。
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

inやoutは何というクラスのオブジェクトでしょうか? 上下に分かれているコードはおそらく送信側、受信側のコードですよね。だとすると別々のコードなのにoutという同名の変数があるので紛らわしいです。 メソッドの戻り値についてはAPIリファレンスで確認できます。 http://java.sun.com./javase/ja/6/docs/ja/api/index.html 引数なしのread()なら、おそらくこれでしょう。 http://java.sun.com./javase/ja/6/docs/ja/api/java/io/InputStreamReader.html#read() 読んで頂ければ分かりますが、引数のあるread()の戻り値は「読み込まれた文字数」になりますが、引数のないread()の戻り値は読み込んだ文字そのものです。よって while ((ch = in.read()) != -1) { // 省略 } というループであれば、ループ内に処理が移った回数が読み込まれた文字数と等しくなるはずです。ループの外でループカウント用の変数を定義して、whileループの中でそれをインクリメントしてやれば、現在の読み込み文字数が分かるのでは。 > 本当にdata-2が書き込まれて送信されたのか flush()の挙動が信じられないということでしょうか? そもそも質問者さんはデータが「どこに」書き込まれて「どこまで」送信されたら「送信された」とみなしたいのでしょうか。そのあたりが曖昧なまま、やみくもに質問されているように感じます。 ついでに、 for (int i = 0; i < data-2; i++) {   out.write(i); } これだとdataがどれほど大きくても、4 x 115 + 1バイトまでで受信側が計測を終了してしまうような。想像ですが、送りたいのはiではなくてdata配列の中身なのでは? また out.write('\\'); これも不要に見えます。これが2行あることで、8バイト余計にデータが送信されますがそれで問題ないのでしょうか?

debukawa
質問者

お礼

回答ありがとうございます。 質問後に、すこしプログラムの内容を変更しました。 以前は、受信にかかる時間を計測し、結果をかえす処理を行う予定でした。よってout.println(Micros);としていました。 変更後は、受信したバイト数を確認し、確認したバイト数分のデータを 送信側に送ろうと考えています。 そのプログラムを書きました。送信側でデータを次のように作成しています。 Socket sock = new Socket(host, port); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); for (int i = 0; i < Data - 1; i++) {  out.write(i); } out.write('s'); out.flush(); Dataは送信するバイト数で自分で指定するようになっています。 受信側では、次のように受信します。 BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); long startNs = System.nanoTime(); while ((ch = in.read()) != -1) {  if (ch == 's') {   long Ns = System.nanoTime() - startNs;   Micros = Ns / 1000; } この後、同様にして届いたバイト数文のデータを送信側に送ろうと考えています。 >現在の読み込み文字数が分かるのでは。 ということは、次のようにすればよいですか? int count; while ((ch = in.read()) != -1) {  if (ch == 's') {   long Ns = System.nanoTime() - startNs;   Micros = Ns / 1000; } count++; } >flush()の挙動が信じられないということでしょうか? そもそも質問者さんは >データが「どこに」書き込まれて「どこまで」送信されたら「送信された」とみなしたいのでしょうか。 fulsh()で送信されるということですよね? outというバッファの中にforのなかの処理で作られたバイトデータを格納して、fulsh()で送信していると考えています。 Data=10000とすると、 forの中の処理で、次のようなデータを作ろうとしています。 012345678...9999s sまで送信されたら送信完了としたいです。 >4 x 115 + 1バイトまでで受信側が計測を終了してしまうような。 Dataはint型で送信したいデータのバイト数で、その数値分のバイトを送りたいです。どうして4 x 115 + 1バイトまでで終了するのでしょうか? 質問だらけですいません。

すると、全ての回答が全文表示されます。

関連するQ&A