ソケットデータの送信と受信
import java.net.*;
import java.io.*;
public class MyConnection2
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("www.ptpress.com.cn", 80);
//
OutputStream ops = socket.getOutputStream();
OutputStreamWriter opsw = new OutputStreamWriter(ops);
BufferedWriter bw = new BufferedWriter(opsw);
bw.write("hello world\r
\r
");
bw.flush();
//
InputStream ips = socket.getInputStream();
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String s = "";
while((s = br.readLine()) != null)
System.out.println(s);
socket.close();
}
}
上記のコードを記述する際には、次の2点に注意してください.
1.Socketクラスは、データ転送の効率を向上するためにwriteメソッドを呼び出すたびにデータ転送を行うのではなく、転送するデータを1つのバッファ(デフォルトは8192バイト)に書き込み、flush法によりこのバッファ内のデータを一緒に送信するため、bw.flush();必要です.
2.文字列の送信時にHello Worldの後に「rr」を付けるのは、HTTPプロトコルヘッダが「rr」を終了フラグとしているため(HTTPプロトコルの詳細は後述する)、文字列の送信後に「rr」を加えることで、HTTPヘッダが終了したとサービス側シーケンスに認識させ、処理することができる.「rr」を付けなければ、サービス側プログラムはHTTPヘッダの終了、すなわち「rr」をずっと待つことになる.このようにすると、サービス側プログラムはクライアントに応答情報を送信、br.readLine()は、接続がタイムアウトするまで、メッセージに応答するために読めないためブロックされます.