ソケットデータの送信と受信

1476 ワード


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()は、接続がタイムアウトするまで、メッセージに応答するために読めないためブロックされます.