今回の「Javaの入出力」シリーズは、ソケット間通信。
といっても、ソケットには、サーバーとクライアントがあるので、まずは、クライアント側からやります。サーバーを作っても、クライアントがいないと、悲しいものがあるので(^^;)
で、クライアントなんですが、HTTPプロトコルを、YAHOO(www.yahoo.co.jp)のポート80番に対して送ります。ってことは、HTTP通信してるのと同じなんですけど、まあ、ソケットの実験ということで、そうします。
ソケット間通信についても、すでに、ここに一般的な場合について書いてあるのですが、せっかく、出力について、ここでまとめているので、今回は、その考え方にのっとり、
InputStreamReader(InputStream)
OutputStreamWriter(OutputStream)
の形にもっていって、そこからBufferedWriterをかぶせて使うという方法をやってみたいと思います。
■ソケットのクライアント側の通信の流れ
クライアント側は、
1.ソケットを生成する
2.ソケットのOutputStreamを取り出し、
3.出力する
4.ソケットのInputStreamを取り出し、
5.返り値が帰ってくるまで待ち、
6.帰ってきたら適当に処理して
7.処理が終わったらクローズする
ということになります
■注意点
ここでの注意点は、
・出力終了後に、すぐにクローズしない
そうすると、ここで終わってしまうみたいです。
なので、flashして中身を出し、全部終わったらクローズします
・返り値が帰ってくるまで待つ
すぐに帰ってこないので、読み込めるまで
while(is1.available() == 0);
で待ちます
・返り値は、一発で全部受け取れるわけではない
実際には、読み込んだ後、
またis1.available() が0になって、
その後またis1.available()>0
になって読み込めるということがあります。
っていうことなのですが、今回は、1回目受け取った分を
出して終わりとします(実際そうしたら、途中までになってました)
・HTTPプロトコル
今回は、"GET / HTTP/1.0"のあとに、改行を2回打ってます。
受け取りのときは、ヘッダーがついて受け取れます。
■手順
●送信手順
まず、
Socket socket = new Socket("www.yahoo.co.jp",80);
で、ソケットを生成した後、いつもどおり
OutputStreamWriter ow1 = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bw1 = new BufferedWriter(ow1);
でBufferedWriterをつくり、これで送信して、flashします。
●受信手順
送信のとき使ったsocketと同じsocketのInputStreamを使います。
InputStream is1 =socket.getInputStream();
InputStreamReader ir1 = new InputStreamReader(is1,"EUC_JP");
BufferedReader br1 = new BufferedReader(ir1);
という形で、BufferedReaderを取得するまではいままでどおりです。
ただし、すぐに受信できないため、
while(is1.available() == 0);
で受信待ちした後、データを書き出し(はじめに来たデータのみ)
そのあと、クローズしています。
■ソース
こんなかんじ
import java.io.*; import java.net.*; public class test { public static void main(String[] args) { try { // ソケットを生成 Socket socket = new Socket("www.yahoo.co.jp",80); //-------------------- //送信する //-------------------- OutputStreamWriter ow1 = new OutputStreamWriter(socket.getOutputStream()); BufferedWriter bw1 = new BufferedWriter(ow1); //POSTの内容を書き出す bw1.write("GET / HTTP/1.0¥r¥n¥r¥n"); bw1.flush(); //-------------------- //受信する //-------------------- InputStream is1 =socket.getInputStream(); InputStreamReader ir1 = new InputStreamReader(is1,"EUC_JP"); BufferedReader br1 = new BufferedReader(ir1); // よみこめるまでまってる while(is1.available() == 0); // はじめに読み込んだものを書き出す char[] cline = new char[is1.available()]; br1.read(cline); System.out.println(cline); // クローズ bw1.close(); ow1.close(); br1.close(); ir1.close(); } catch(Exception e) { e.printStackTrace(); } } } |
(上記の < > ¥は、本当は半角です)