- ベストアンサー
java:読み込んだデータの確認
javaを使って通信のプログラムをつくっています。 送信側でバイトデータを作成して送信します。そして受信側でそのバイトデータを読み込みます。 送信側で作ったバイト数が本当に受信側に届いたかのチェックをするには、 どうすればよいでしょうか?下のコードは、自作した受信処理です。 調べると、read(byte[] b,int off,int len)の返り値が読み込んだバイト数ということなので、 これを使うのではないかと思うのですが、どう使えばよいか分かりません。下のコードは、とりあえず、受信したらcount++として受信処理分だけ countを増やして受信したバイトを数えています。 readの返り値で受信したバイト数を取得するには、どうすればよいでしょうか? 御教授お願いします。 送信側 BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); for (int i = 0; i < Data; i++) { for (;;) { try { out.write(i); out.flush(); count++; break; } catch (IOException e) { System.err.println((count + 1) + "つ目のバイト:書き込みエラー>>再書き込み"); } } } 受信側 BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); int ch = 0; // 読み込んだ文字 int Count = 0; // 届いたバイト数のカウンター while (ch != -1) { try { ch = in.read(); Count++; } catch (IOException e) { System.err.println(Count + "つ目のバイトデータ:読み込みエラー"); } }
- debukawa
- お礼率77% (64/83)
- Java
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
引数なしのread()ではなくてread(byte[],int,int)のほうを使いたいが、その使い方が分からないということですか? byte[] buf = new byte[適当なサイズ]; int n; int s = 0; while ((n = in.read(buf, 0, buf.length)) >= 0) { s += n; } 例外処理は適宜行ってください。 もっとも、こういう使い方なら3引数のread()ではなくて1引数のread()を使って n = in.read(buf) でも同じ意味なんですが。
その他の回答 (1)
- komi1341
- ベストアンサー率65% (25/38)
> 読み取るバイトがなくなるまでループさせて時間をはかっています。 > ですから、read()はバイトをひとつずつ読み取るためにも消去できないと思っています。 拝見した限り、一文字ずつ読み込む理由は単に、終端を現す文字's'を判定したいだけではないでしょうか? それなら一文字ずつ読み込むようなことはしなくとも、read(byte[],int,int)でバッファに読み込めたデータの最後の文字をチェックすれば済むので、引数なしread()は不要でしょう。 またメソッドの使い方ならAPIリファレンスを見れば書いてありますし、もっと具体的な例を見たければSUNのサイトのチュートリアルを見るか、「java read」のようなキーワードで検索すればいくらでもでてきます。自分でちょっと調べれば分かるようなことはご自身で解決できるようにされた方がよいと思います。以下は検索してすぐに見つかったサイト例です。 http://www.ep.u-tokai.ac.jp/~kikn/Java2003/text-IO.html
お礼
回答ありがとうございます。 なんとか解決しました。ありがとうございました。
関連するQ&A
- TCP通信のプログラム(java)
javaを使ってTCP通信のプログラムを作りました。 そのプログラムは次のような動作をさせたいですが、途中までしか動作確認がとれません。 1. 送信側で指定したバイト数のデータを送信する。それにかかった時間を計測する。 2. 送信されたバイトデータを受信する。届いたバイト数の確認をするとともに、受信にかかった時間を計測する。 3. 受信側は1.で行った処理と同じようにして、届いたバイト数分のデータを返信する。 4. 3.で送信側に送信されたデータを受信して、受信時間を計測する。届いたバイト数を確認する。 2.までは、正常に動作します。正常な動作とは、 送信側は、指定した数のバイトデータを送信して、それにかかった時間を計る。 受信側は、送信されたデータを受信して、それにかかった時間を計り、届いたバイト数を確認する。ちなみにこの2つの時間はほぼ同じになります。 ここまではできています。 ですが、送信側が受信側で届いたバイト数分のデータを送信し、送信側でそのデータを受信してその時間を測るというコード(//*受信処理*//という行から下)を追加するとうまくいきません。 受信側では、//*受信処理*//という行から下を追加すると、うまくいきません。 送信と受信処理のコードを載せます。 送信側(送信バイト数は入力させます) Socket sock = new Socket(host, port); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); //*送信処理*// // 送信データを送信する。 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data; i++) { try { out.write(i); out.flush(); count++; } catch (IOException e) { System.err.println((count + 1) + "つ目のバイト:書き込みエラー"); } } stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); System.out.println("送信されたバイト数:" + count); // 送信スループットを計算する。 // 結果を表示する。 //*受信処理*// // 変数を定義する。 long startNs = 0; // 受信前の時間のナノ秒を返す。 long stopNs = 0; byte[] buf = new byte[1000000]; int total = 0, part; // ストリームの終わりに達し,-1が返されるまで受信する。 System.out.println("<データ受信処理>"); startNs = System.nanoTime(); while ((part = in.read(buf, 0, buf.length)) != -1) { total += part; System.out.println(part); } stopNs = System.nanoTime(); System.out.println("受信完了"); System.out.println("受信されたバイト数:" + total); // 受信スループットを計算する。 // 結果を表示する。 // 出力ストリーム・ソケットをクローズする。 out.close(); sock.close(); 受信側のコードは補足欄に載せます。このコードだと、 送信側の計測結果は表示されますが、受信側で受信時間や受信速度などが表示されません。 送信側で通信を強制終了すると、その後に受信側は、結果を表示します。 データを片道ではなく往復させて、それらの処理時間を計測したいのです。うまくいかないのでアドバイスを頂きたいです。 このコードのおかしい部分が分かる方はアドバイスをお願いします。 コードが見にくくて意味がわからないかもしれませんが、そうならば、データを往復させてその時間を測るためのアドバイスをお願いします。
- ベストアンサー
- Java
- 出力ストリームへの書き込みでエラー
サーバ側では、クライアントが送信したバイトデータを受信させます。read()の戻り値を利用して、届いたバイトを確認します。 そして、サーバ側がクライアント側に、届いたバイトデータ分だけの バイトデータを送信します。これらにかかる時間も計測するプログラムを作成しています。 サーバ側がバイトデータを受信し、その時間を計測する所までは、動いたのですが、 サーバ側がクライアント側に、バイトデータを送信する処理の、出力ストリームへの書き込みの処理でエラーが生じます。 Xつ目のバイト:書き込みエラーと表示されます。 なぜエラーになってしまうのでしょうか?送信と受信の処理部分のコードを載せるので、おかしな部分を指摘していただきたいです。 ServerSocket server = new ServerSocket(servPort); Socket sock = server.accept(); BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); long startNs = 0; long stopNs = 0; byte[] buf = new byte[1000000]; int total = 0, part; System.out.println("<データ受信処理>"); startNs = System.nanoTime(); // 受信前の時間のナノ秒を返す。 while ((part = in.read(buf)) != -1) { total += part; System.out.println(part); }System.out.println(part); stopNs = System.nanoTime(); // 受信後の時間のナノ秒を返す。 System.out.println("受信完了"); System.out.println("受信されたバイト数:" + total); // 受信スループットを計算する。 ... int count = 0; // write()の回数 System.out.println("<データ送信処理>"); for (int i = 0; i < total; i++) { try { out.write(i); out.flush(); count++; } catch (IOException e) { System.err.println((count + 1) + "つ目のバイト:書き込みエラー"); } } // 結果を表示する。 System.out.println("送信完了"); System.out.println("送信されたバイト数:" + count);
- ベストアンサー
- Java
- read()メソッドを使ったループの抜け方
通信のプログラムを作っています。 送信側では、指定した数のバイトデータを作成し、送信します。 受信側では、そのバイトデータを受信して、受信にかかった時間を計測します。 送信側では、次のようにしてデータの最後の文字をsとして、作っています。 受信側では、sを読み込んだら、受信完了と見なし、受信処理を終了します。 送信と受信処理のコードを見てください。 送信側(Dataは指定したバイトデータの数値です) for (int i = 0; i < Data-1; i++) { out.write(i); out.flush(); } out.write('s'); out.flush(); 受信側 while((part = in.read(buf,0,buf.length)) != -1) { total += part; } 受信側のコードだと、送信されたバイトがすべて読み込んだらループを抜けるのですが、 そうではなく、sを読み込んだらループを終了させたいのです。 read(buf,int,int)の戻り値を使って受信されたバイト数を確認したいため、 どうしてもread(buf,int,int)を使って受信したいのです。 read(buf,int,int)を使いつつ、送信バイトの最後の文字sを読み込んだら ループを抜けるようにするには、どうすればよいでしょうか? アドバイスをお願いします。 自分で考えたコードを載せます。 読み込んだバイトをbufに入れる。 そして読み込んだバイト数を合計する。 bufの最後の文字がsならループを抜けるというようにしたいのですが、 指定したデータ分を読み込みません。 for(;;){ part = in.read(buf); total += part; if(buf[total] == 's'){ break; } } こちらの方も、指導していただきたいです。
- ベストアンサー
- Java
- socketでのバイナリファイルの扱い方
javaのsocketを用いてファイルの送信サーバ、受信クライアントを作成しているのですが テストプログラムとしてスレッド化せずに送信・受信部のみ作りました。 症状はバイナリデータの転送がうまくできないことです。ソースを抜粋すると サーバ側で BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());//socketはSocketクラス BufferedInputStream in1 = new BufferedInputStream( new FileInputStream("test1.bmp")); BufferedInputStream in2 = new BufferedInputStream( new FileInputStream("test2.bmp")); while( (c = in1.read() ) != -1 ){ out.write(c); } while( (c = in2.read() ) != -1 ){ out.write(c); } クライアント側で BufferedOutputStream out1 = new BufferedOutputStream( new FileOutputStream("test1.out.bmp") ); BufferedOutputStream out2 = new BufferedOutputStream( new FileOutputStream("test2.out.bmp") ); BufferedInputStream in = new BufferedInputStream( s.getInputStream() ); while( ( c=in.read() ) != -1 ){ out1.write(c); } while( ( c=in.read() ) != -1 ){ out2.write(c); } とやっています。 クライアント側で1回目のin.readを抜けるときにはサーバ側は既に2回のwriteを終わっているようで ファイルはtest1.out.bmpにマージされていました。 サーバ側の1回目のwriteのオブジェクトがcloseしていないことが原因だと思い1回目のwriteが終わった時点でout.close()とした のですがそうやるとsocketも閉じてしまいsocket closeのエラーが生じてしまいました。 このようにならず1本のコネクションでバイナリのデータを複数送信する方法をご存知でしたら教えてください。 [環境] win2ksp1a,j2sdk1.4.1_03,java経験4ヶ月程度
- 締切済み
- Java
- メッセージを受信したら受信終了したい
TCPでスループットを測定するプログラムを作っています。 データの受信を終了するには、送信側がソケットをクローズして、 受信側のread()メソッドが-1を返すのが主流だと考えていますが、 私のプログラムでは、受信した後に受信側から送信側へデータを返信したいため、 ソケットをクローズすることで受信終了というようにしたくないです。 また、受信したバイト数をread(buf,int,int)の戻り値で取得したいです。 私が考えている方法としては、送信側で「finish」というメッセージを送信したら、 受信側で受信を終了させようと考えました。 read(buf,int,int)はbufに受信したバイトを格納すると思います。格納されたバイトの最後から6個を確認させ、 finishならば受信終了にすればよいと考えました。 送信側のコードは下のようにしました。 String signal = "finish"; byte[] signal_buf = signal.getBytes(); send_start = System.nanoTime(); for (int i = 0; i < Data-6; i++) { try { out.write(i); out.flush(); } catch (IOException e) { System.err.println(e); } } out.write(signal_buf); out.flush(); send_stop = System.nanoTime(); System.out.println("送信完了"); 受信側は、finishを読み込んだらループを抜けるようにしたいです。 recv_start = System.nanoTime(); for(;;){ part = in.read(buf); if(part > 0) total += part; if(finishを読み込んだら){ break; } } recv_stop = System.nanoTime(); どのようにしてfinishを読み込んだことを認識させれば良いでしょうか? ・合図となるメッセージにより受信を終了すること、 ・read(buf,int,int)の戻り値で読み込んだバイト数を取得すること、 この2点を絶対に削りたくないのです。 どうすればよいか、アドバイスをいただけないでしょうか?
- ベストアンサー
- Java
- バイナリファイルを転送したいのですが
お世話になります socketを用いてサーバへファイルを転送したいのですが、うまくいきません。 以下ソースからの抜粋です BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); BufferedInputStream in = new BufferedInputStream(new FileInputStream("test.txt")); int c; while((c = in.read()) != -1 ){ out.write(c); } 上記のようなコーディングでは転送できないのでしょうか? 出来ればファイルから1024バイトずつ読み込んで1024バイトずつ出力していき、ファイルの終端まで繰り返す処理をしたいのですが、よい方法をご存知でしたら教えていただけないでしょうか?
- ベストアンサー
- Java
- ファイル読み込み/書き込み速度を上げるには
下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか? BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data")); BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data")); int c ; while((c = in.read()) != -1) { out.write(c); } in.close(); out.flush(); out.close();
- ベストアンサー
- Java
- 例外処理の付け方
javaを使って通信のプログラムを作成しています。 ホストAで送信データを作成し、そのデータをホストBに送信して、 ホストAが送信するのにかかった時間と、ホストBが受信するのにかかった時間を 計測するプログラムを作成しました。 送信と受信の処理を行うのですが、送信側では、write()でバッファに書き込んで、 fulsh()で書き込まれたバイトを出力ストリームに書き込みます。 受信側では、while((ch=in.read()) != -1)で送信データをすべて読み込ませます。 write()、fulsh()を使って送信し、read()で受信するのですが、 これらのメソッドが正常に動いたかどうかを調べたいのです。 ネットで方法を調べたのですが、try catchを使うことで例外処理が発生したら、 エラーを出力させることができることがわかりました。 もしurite(),fulsh(),read()が正常に起動しないならエラーを出したいのです。私なりに考えて以下のようにしました。 コードは以下のとおりです。送信部分、受信部分です。 送信側 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data - 2; i++) { try { out.write(i); count++; } catch (IOException e) { System.out.println(i + ":書き込みエラー"); } } try{ out.write('\\'); }catch(IOException e){ System.out.println("\\" + "書き込みエラー"); } try{ out.write('s'); }catch(IOException e){ System.out.println("s" + "書き込みエラー"); } count = count + 2; out.flush(); stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); 受信側 while (ch != -1) { try{ ch = in.read(); }catch(IOException e){ System.out.println("読み込みエラー"); } Count++; if (ch == '\\') { on = true; } else if (on == true && (char) ch == 's') { stopNs = System.nanoTime(); System.out.println("受信終了時間を確認"); break; } else if (on == true && (char) ch != 's') { on = false; } } メソッドが正常に起動しない場合は、例外処理を行うということを したいのですが、上の方法は正しいのでしょうか? このようにして実行しても、「入力エラー」と言う表示はされません。 もしかしたら、ただ異常な動作が行われていないから、そういったエラーが 表示されないのかもと考えましたが、例外処理の書き方が違う可能性があると思い、 質問させていただきました。 どなたかアドバイスしていただけないでしょうか?
- ベストアンサー
- Java
- UDPプログラム、データの送受信
javaを使って通信の勉強をしています。 UDPを用いた通信のプログラムを作成しています。 送信側では、次のようにして送信したいバイト数を分割して送信しています。 BUF_MAX = 40960; DatagramSocket socket = new DatagramSocket(); // data分のバイトデータを分割して送信する。 int part = 5242880 / BUF_MAX; // 分割して送信する回数 send_start = System.nanoTime(); for(int i = 0;i < part;i++){ byte[] buf = new byte[BUF_MAX]; buf[0] = (byte)i; DatagramPacket sendPacket = new DatagramPacket(buf,BUF_MAX,serverAddress,servPort); total += BUF_MAX; // 指定したバイト数を送信する。 try{ socket.send(sendPacket); }catch(IOException e){ System.out.println(e); } } System.out.println(total); このようにしています。 こうする理由は、5242880バイトのデータを128回に分割して送信して、 受信側で受信したパケットの最初の文字を見て、何個目のパケットが届いていないかを確認するためです。 受信側でこれらのデータを受信する方法を考えているのですが、どうすればよいか分かりません。 receive(packet)で受信するのは知っています。 送信された複数のデータを受信するのに、 for(int i = 0;i < 128; i++){ receive(packet); } というようにするのでしょうか?このようにすると、 このループを抜けることができません。それは、パケットが通信途中で紛失するため、128回受信しないからだとおもいます。 受信しなくなったらループを抜けるというようにすればよいとおもいますが、その方法が分かりません。 どなたかアドバイスをいただけないでしょうか?お願いします。
- ベストアンサー
- Java
- read(buf,int,int)メソッドで1文字取得する
javaを使ってプログラミングを勉強しています。 read(buf,int,int)メソッドで受信したバイトデータをbufに格納していると思うのですが、 格納したバイトの最後の文字を取得する方法が分かりません。 送信側では送信バイトの最後の文字をsにして送信します。 受信側では読み込んだバイトデータの最後の文字がsだったら、 ループを抜けるというようにしたいのです。 どうやって最後の文字を取得するのでしょうか?
- ベストアンサー
- Java
お礼
回答ありがとうございます。 説明不足でしたので追加します。 受信時間を計測したいため、最初の質問欄に載せたコードに受信開始時間と終了時間のコードをつけています。次のようにしています。 System.out.println("受信開始時間を確認"); startNs = System.nanoTime(); while (ch != -1) { try { ch = in.read(); if(ch != -1) Count++; } catch (IOException e) { System.err.println(Count + "つ目のバイトデータ:読み込みエラー"); } if (ch == 's') { stopNs = System.nanoTime(); System.out.println("受信終了時間を確認"); } } 読み取るバイトがなくなるまでループさせて時間をはかっています。 ですから、read()はバイトをひとつずつ読み取るためにも消去できないと思っています。 上のコードのままで、read(byte[],int,int)を追加して読み込んだ総バイト数を 確認したいのです。 どのようにすればよいでしょうか?