• 締切済み

JAVAでのソケット通信について

ソケット通信について、webページとJAVAのAPIを見ながら勉強していまが、 BufferedInputStreamクラスとDataInputStreamクラスがありました。 この2つのクラスはどのような違いがあるのでしょう?? また、それらのクラスにはavailable() というメソッドがありました。 「ブロックせずに入力ストリームから読み込むことができるバイト数を返します。」と書かれていますが、どういう意味なのでしょう??ブロックってどういうことなのでしょうか?? ご指導のほど、よろしくお願いいたします。

みんなの回答

  • isle
  • ベストアンサー率51% (77/150)
回答No.1

BufferedInputStream…読み込んだデータをバッファに蓄えておいて読み直したりできます DataInputStream…任意のデータ型のデータを読み出したり、一気に配列に読み込んだりできます 使い分けるだけなく // ※in … InputStreamのインスタンス BufferedInputStream bin = new BufferedInputStream(in); DataInputStream din = new DataInputStream(bin); てな感じで、dinでデータを読み出しつつ、binで読み出し位置を巻き戻したりできます。 > ブロックってどういうことなのでしょうか?? ネット経由でデータを受信する場合、パケット単位で受信したりします。 また回線の状態に影響されて遅延が発生したりします。 既に受信し終わっている分を超えて読み出そうとすると要求された分を満たすまでさらにネットから受信しようとしてメソッドから処理が戻らなくなり、プログラムは見た目に停止しているようになります。 そういう状態をブロックしていると言います。

FCTOKYO
質問者

お礼

分かりやすい説明ありがとうございます。 あれから自分なりにgoogleで検索をして、こんなところを見つけました。 http://java2005.cis.k.hosei.ac.jp/materials/lecture22/binstream.html isleさんの説明と上のURLのおかげで、理解というか、イメージできるようになりました。 いや~、なんでもそうなのですが、分かるようになると面白いものですね。 ありがとうございました。

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

関連するQ&A

  • markメソッドについて

    入出力のReaderクラスでmarkメソッドがよくわかりません。 APIにはストリームの現在位置にマークを設定するとかいてありますが、何のことなのかさっぱりです・・・ bufferedInputStream.mark(100);    この引数の100は何の数ですか?

    • ベストアンサー
    • Java
  • ソケットにおけるメッセージの送受信について

    いつもお世話になっています。 ソケットに関して質問します。 下記の手順でソケットを使用したいと考えています。 クラスAとクラスBが存在する。 1)クラスA:ソケット通信でメッセージ送信 2)クラスB:ソケット通信によるメッセージを取得 3)クラスB:ソケット通信で返信する 4)クラスA:ソケットによるメッセージを再取得する このとき、クラスAがクラスBによるメッセージ再信が、30秒以内にこなければ、ソケットを閉じる それにあたってソースを1クラスで実行できるよう書き変えたいのですが、どうも上手くいきません。 実行したいメソッド手順が ソケットを開く openSocket ソケットにメッセージ送信 sendMsg ・・・1と3はこのメソッドを使用 メッセージ取得 getMsg ・・・2と4はこのメソッドを使用 ソケットを閉じる closeSocket の順です。 自分で一度考えてみたソースは以下です。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Messaneger{ private Socket socket; private BufferedReader in; // ソケットを開く public void openSocket() { ServerSocket serverSocket; try { serverSocket = new ServerSocket(5555); System.out.println("クライアントからの接続をポート5555で待ちます"); // クライアントからの接続を待ちます Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + "から接続を受付ました"); // 出力ストリームを取得 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); } catch (IOException e) {} } //ソケットを閉じる public void closeSocket() { try { socket.close(); } catch (IOException e) {} } /** * ソケット通信でメッセージを送信 * @param 送信するメッセージ */ public void setMsg(String sendMsg) { try { socket = new Socket("localhost", 5555); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); //サーバーにメッセージ送信 out.println( sendMsg ); //送信メッセージdata System.out.println(sendMsg); } catch (IOException e) {} } /** * ソケット通信でメッセージを取得 * @return msg サーバーに渡されたメッセージ */ public String getMsg() { String getMsg = ""; BufferedReader in; try { in = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println(in.readLine()); } catch (IOException e) {} return getMsg; } } 参考URL:http://www.hellohiro.com/socket.htm 宜しくお願いします。

  • UDPソケット通信におけるデータパケット

    UDPソケット通信をする際、受信データサイズとして考慮するべきサイズはアプリサイズとUDPヘッダー(8バイト)としてソケットオプションで受信バッファサイズを増加させたのですが、予想より受信できるパケット数が少ないです。 例) 1パケットのアプリサイズを10バイトしUDPヘッダーも考慮して実際1パケットあたり18バイトとして、最大5パケット受け取れるようにソケットオプションで アプリサイズ(10バイト)× UDPヘッダー(8バイト)×パケット数(5) 上記のように設定したのですが、実際5パケットも受信できませんでした。 上記のほかにIPヘッダーなども考慮しなければならないのでしょうか? 開発環境:solaris8 C言語

  • Javaの断続的なSocket通信について

    Java標準のSocketクラスで通信プログラムを作ろうと思うのですが、インターネットで散見できるサンプルはだいたい単一のデータを送ってそのままプログラムを終わらせてしまうため、繰り返しデータを送る場合のプログラミングの方法がいまいちわかりません。 同一の接続先に断続的にデータを送信する場合は、新しいデータごとにSocketクラスを作り直さないといけないのでしょうか。それとも既存のSocketクラスのメソッドを使ってループ内で送信の待機をさせるのでしょうか。

  • javaとFlashの通信について

    初めて質問させていただきます。 現在JavaとFlashでWebアプリの勉強をしております。 JavaとFlash個々で単体として動作させることは 今までしてきました。 今回取り組んでいるのが、Flashで画面側を作成して、 Javaでサーバー側を作成するというものです。 現在は 画面側をFlashでサーバー側をJavaで作成していて、 サーバー側はXMLをFlashから受取り、XMLで返す。 画面側はXMLをJavaから受取り、XMLで返す。 そこまではわかるようになりました。 ここで質問なのですが、 Flashの動作として、「クラスを指定してそこに XMLを渡し、また受け取る」その方法がわかりません。 私が調べた中では、URLVariables クラスの使用、 XMLソケットを使用するという方法があることがわかったのですが、 URLVariablesを使用した場合、 送信先のURLを記入しないということで、Java側はまだeclipse上で 作成しただけなので、指定できないと考えていて、 XMLソケットを使用した場合、 接続方法まではインターネットで調べることができ実装することが できているのですが、そのあとのXMLで送受信する方法がなかなか 見つからず実装段階まで至っていません。 また、 サーバー側はサーバー側にアップしておかないと通信できないのか Flashと同じ保存場所でないといけないのかという点と その通信方法のActionScriptの書き方を教えていただけないでしょうか。 参考にさせていただきたいです。 宜しくお願い致します。 tomcat:6.0.18 eclipse:3.4.1 Flash:CS4 ActionScript:3.0 OS:Windows Vista

  • Javaに苦戦中!オブジェクト思考?リファレンスガイドって?

    ただ今Javaについて参考書等で勉強中なのですが、基本的なことは大体わかったのですがどうもオブジェクト思考な開発まで行くと、 「何でこんなややこしいことするの?」とか 「何だこのクラスは?メソッドは?」とゆうことが増えてきてちんぷんかんぷんになってます。 参考書には「Java API リファレンスガイドを参照してください。」とあるのですが、これはネットで見れますか?マイクロソフトの英語のサイトしかないんですかね? ちなみに、仕事で使っておられる方々はクラスだとか、メソッドだとかその引数(コンストラクタ)とか覚えてるんですか?そのつど調べながら開発してるんですか? 教えてください!つまずいてます!!

    • ベストアンサー
    • Java
  • Javaで配列の長さを知るメソッド

    Javaの配列の長さを知るメソッドを調べています。 例えば String sTest[][] = new String[2][2]; sTest[0][0] = "something"; だとして、sTest[0][0]の長さ(文字数)の9を出力したいのですが、どのようにすればいいのでしょうか。 APIを調べて、クラスArrayのgetlengthを使って System.out.println(getlength(sTest[0][0])); としてみたら駄目でした。 また、Stringクラスのlengthを使って System.out.println(length(sTest[0][0])); としても駄目でした。 まだAPIにあまりなれていないのですが、書き方が間違っているのでしょうか?

    • ベストアンサー
    • Java
  • ソケットプログラミングについて

    こんにちは。 前回、質問しました「バード」という者です。 ソケットプログラミングについて質問します。 PC1から、jpegやmpegファイルを送信しPC2で受信するというプログラムをC言語で作ってみたいと思っています。 以前、少しだけJAVAプログラミングでPC1(送信側)からPC2(受信側)へデータを送信するプログラムを作ったのですが、作ったプログラムの概要を以下に示します。 [送信側] (ファイルオープン) InputStream in = new FileInputStream(ss); BufferedInputStream bin = new BufferedInputStream(in); ↓ (データを読みsendメソッドにて随時送信) while((c = bin.read(buffer, 0, buffer.length))!=-1){ dPacket = new DatagramPacket(buffer,buffer.length,iAddress,port); dSocket.send(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); [受信側] (ファイルオープン) OutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); ↓ (送信側から来たデータをreceiveメソッドにて受信) while(true){ dPacket = new DatagramPacket(buffer,buffer.length); dSocket.receive(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); 上記に示す様に、ファイルをオープンし、DatagramSocketとDatagramPacketクラスを用いて送受信し最後に、ファイルをクローズするという形式をとっていました。 C言語の場合でも、ファイルオープン→send関数,receive関数等を用いて送信・受信→ファイルクローズという形をとる事ができるのでしょうか?FTPプログラムやエコープログラムを、よく見かけるのですが・・・・

  • ソケット通信内 read関数について

    現在C言語にソケット通信を作成しているのですが、read関数内の作成でつまずいています。 ご存知でしたら教えてください。 自分なりに調べた結果read関数の戻り値は受信した バイト数、毎回指定サイズ受け取るとは限らないと いうことでした。 そこでread関数を無限ループで回し 指定サイズ受信したら、ループを抜ける使用にしたのですが、受信バイトが0だった場合はどうすればよいのでしょか? よくサンプルなどでは、0だったらエラーと判断し、すかさずbreakしているのですが、一度でも0バイトを受信すると、それ以降は1バイト以上受信出来ないものなのでしょうか? もし出来ないのなら一度でも0を受信したら、breakしようと思っています。 出来るのでしたら、タイマー設定をし、指定受信バイトに満たなくても一定時間が過ぎたらループから抜ける使用にしたいと考えています。 そのほか良い方法があれば教えてください。 分かりずらい説明になってしまいましたが、宜しくお願い致します。

  • ソケットとそれに基づくストリームは1対1でしょうか。

    ソケット通信で、接続してきた クライアント(TcpClient tempclient)から、 NetworkStream,StreamReader,StreamWriterなどを 作っています。 Class A while(true){ tcpclient=server.AcceptClient(); networkstream=tcpclient.getStream(); streamreder=new StreamReader(networkstream...); mythread=new Mythread(tcpclient); // networkstream.close() streamreader.close() //これらを加えると、下の、/* */でエラーになります。 } MyThread B { Public Mythread(TcpCLient tcpclient){ /* ns=tcpclient.Getstream sr=... */ } このクライアントを、別のスレッドで使うため、 mythread=new MyThread(tcpclient)などとして、 別のクラスにもっていき、 そこでも、新たに、NetworkStream,StreamReaderを 作ったとします。 この場合、1つのクライアントにつき、2つの ストリームができるのでしょうか。 経験上、ストリームを作成するコードは 問題なく動きます。 しかし、新たにストリームを得たので、古いのを クローズすると、エラーになります。 新たに作ったストリームは、実は、古いストリームを、 使いまわしていることになるのでしょうか。 少し、分かりづらいかもしれませんが、 何か分かる人がいましたら、よろしくお願いします。