ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

ゼロからはじめるHTTP+WebDAVプログラミング

 ASHでは、技術評論社SoftwareDesign誌(2002年6月号)の「ゼロからはじめるHTTP+WebDAVプログラミング」を執筆しました。 このページでは、執筆時のプログラムを公開しています。コピー&ペーストすることにより利用できます。
 プログラムの詳細は、技術評論社のSoftwareDesign誌を読んでください。
 なお、記事についての質問などがありましたら、ASHの掲示板でも受け付けます。

サンプルソースのダウンロード

 下記のソースを一括ダウンロードできます。 ソースファイルは、LZH圧縮形式と、tar+gzip圧縮形式で、ダウンロード可能となっています。 LZH圧縮形式には、Shift_JISコードのソースが格納されています。 tar+gzip圧縮形式には、EUC-JPコードのソースが格納されています。

sd_http.lzh(LZH圧縮形式のダウンロード)
sd_http.tar.gz(tar+gzip圧縮形式のダウンロード)

JavaによるHTTPプログラミング

Http.java

 JavaのSoketクラスを使って、指定したURLのHTTPヘッダとHTMLソースを表示するプログラムのソースです。

Http.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
import java.io.*;
import java.net.*;

/** Httpプロトコルによるソース表示 **/
public class Http {
  public static void main(String args[]) {
    String url;
    String host;
    int    port;
    String proxyHost;
    int    proxyPort;

    Socket sock;
    BufferedReader sockin;
    BufferedWriter sockout;
    String str;

    try {
      // プロキシの設定
      proxyHost = "";
      proxyPort = 8080;

      // URLの設定
      if (proxyHost.equals("")) { // プロキシを使わない場合
        url  = "/";
        host = "www.ash.jp";
        port = 80;
      } else { // プロキシを使う場合
        url  = "http://www.ash.jp/";
        host = proxyHost;
        port = proxyPort;
      }

      // ソケットの作成
      sock = new Socket(host, port);
      sockin = new BufferedReader(new InputStreamReader(sock.getInputStream()));
      sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));

      // HTTPリクエスト送信
      sockout.write("GET " + url +" HTTP/1.1\r\n");
      sockout.write("Host: " + host + "\r\n");
      sockout.write("Connection: close\r\n");
      sockout.write("\r\n");
      sockout.flush();

      // HTTPレスポンス受信
      while ((str = sockin.readLine()) != null) {
        System.out.println(str);
      }

      // ソケットのクローズ
      sockout.close();
      sockin.close();
      sock.close();

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

HttpURL.java

 JavaのHttpURLConnectionクラスを使って、指定したURLのHTTPヘッダとHTMLソースを表示するプログラムのソースです。

HttpURL.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
import java.io.*;
import java.net.*;

/** Httpプロトコルによるソース表示(HttpURLConnectionクラス利用) **/
public class HttpURL {
  public static void main(String args[]) {
    String url;
    String proxyHost;
    int    proxyPort;

    URL urlObj;
    HttpURLConnection urlCon;
    BufferedReader urlIn;
    String str;

    try {
      // プロキシの設定
      proxyHost = "";
      proxyPort = 8080;

      // URLオブジェクトの作成
      url = "http://www.ash.jp/";
      if (proxyHost.equals("")) { // プロキシを使わない場合
        urlObj = new URL(url);
      } else { // プロキシを使う場合
        urlObj = new URL("http", proxyHost, proxyPort, url);
      }

      // URL接続
      urlCon = (HttpURLConnection)urlObj.openConnection();
      urlCon.setRequestMethod("GET");
      urlIn = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));

      // HTMLソースの表示
      while ((str = urlIn.readLine()) != null) {
        System.out.println(str);
      }

      // URL切断
      urlIn.close();
      urlCon.disconnect();

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

Javaによるクライアントとサーブレットとの通信

HttpServer.java

 HttpClient.java、HttpIClient.javaに対して、"Hello World!"という文字列と、123という整数の値を返却するサーブレットのソースです。

HttpServer.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** HTTP通信サーブレット **/
public class HttpServer extends HttpServlet {
  public void doGet (HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    DataOutputStream out;

    res.setContentType("application/octet-stream");
    out = new DataOutputStream(res.getOutputStream());

    out.writeUTF("Hello World!");
    out.writeInt(123);

    out.close();
  }
}

HttpClient.java

 HttpServer.javaから、"Hello World!"という文字列と、123という整数の値を受け取り表示するアプレットのソースです。

HttpClient.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;

/** HTTP通信クライアント(アプレット) **/
public class HttpClient extends Applet {
  String msg;
  int num;

  public void init() {
    HttpURLConnection con;
    DataInputStream in;
    String url = "http://localhost/servlet/HttpServer";
    URL urlObj;

    try {
      // HTTP接続
      urlObj = new URL(url);
      con = (HttpURLConnection)urlObj.openConnection();
      con.setRequestMethod("GET");
      con.connect();
      in = new DataInputStream(con.getInputStream());

      // HTTPデータの設定
      msg = in.readUTF();
      num = in.readInt();

      // URL切断
      in.close();
      con.disconnect();

    } catch (Exception ex) {
      msg = ex.getMessage();
    }
  }

  public void paint(Graphics g) {
    g.drawString(msg, 10, 30);
    g.drawString(Integer.toString(num), 10, 50);
  }
}

HttpIClient.java

 HttpServer.javaから、"Hello World!"という文字列と、123という整数の値を受け取り表示するiアプリのソースです。

HttpIClient.java
// Copyright (C)1995-2002 ASH multimedia lab. http://ash.jp/
import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
import javax.microedition.io.*;
import java.io.*;

/** HTTP通信クライアント(iモード) **/
public class HttpIClient extends IApplication {
  MainCanvas mc; // メインキャンバス

  public void start() {
    mc = new MainCanvas();  // メインキャンバスの作成
    Display.setCurrent(mc); // メインキャンバスを画面に表示
  }
}

class MainCanvas extends Canvas {
  String msg;
  int num;

  public MainCanvas() {
    HttpConnection con;
    DataInputStream in;
    String url = "http://localhost/servlet/HttpServer";

    try {
      // HTTP接続
      con = (HttpConnection)Connector.open(url, Connector.READ, true);
      con.setRequestMethod("GET");
      con.connect();
      in = new DataInputStream(con.openInputStream());

      // HTTPデータの設定
      msg = in.readUTF();
      num = in.readInt();

      // URL切断
      in.close();
      con.close();

    } catch (Exception ex) {
      msg = ex.getMessage();
    }
  }

  public void paint(Graphics g) {
    g.drawString(msg, 10, 30);
    g.drawString(Integer.toString(num), 10, 50);
  }
}


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp