ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Javaの入出力:Socket通信(クライアント側)

2006-09-19 16:30:29 | JavaとWeb

 今回の「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();
		}	
	}

}

(上記の < > ¥は、本当は半角です)
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« IHTMLVIEWERの具体的な使い方... | トップ | FireFoxのマスコットキャラク... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事