その1 JavaでHTTP通信HTTP通信をjava.net.Socketで行う。HTTP通信なら、jdkのHttpURLConnectionやJakarta Commons HttpClient などで簡単にできそうですが、ここではjava.net.Socketで通信を行います。 やりたいこと
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;
import org.apache.log4j.Logger;
/**
* HTTPのPOSTメソッドを使用してリクエストメッセージを発行する。
*/
public class HTTPUtil {
/** ログクラス */
private static Logger log = Logger.getLogger(HTTPUtil.class);
/**
* HTTPでリクエストメッセージを発行し、レスポンスを返す。
*
* @param proxyHost プロキシサーバホスト
* @param proxyPort プロキシサーバポート
* @param String targetUrl 接続先URL
* @param int timeout 接続タイムアウト(ミリ秒で指定)
* @param Map postData POSTメソッドで送信するデータ
* @return String レスポンスデータ
*/
public static String getHttpResponse(String proxyHost,
int proxyPort,
String targetUrl,
int timeout,
Map postData) {
// POSTで送信するデータを設定
Iterator itr = postData.keySet().iterator();
StringBuffer data = new StringBuffer();
while (itr.hasNext()) {
String mapKey = (String)itr.next();
data.append(mapKey + "=" + postData.get(mapKey) + "&");
}
Socket sock;
BufferedReader sockin;
BufferedWriter sockout;
StringBuffer responseBody = new StringBuffer();
try {
// ソケットの作成
sock = new Socket(proxyHost, proxyPort);
// タイムアウト値を設定
sock.setSoTimeout(timeout);
sockin = new BufferedReader
(new InputStreamReader(sock.getInputStream()));
sockout = new BufferedWriter
(new OutputStreamWriter(sock.getOutputStream()));
// HTTPリクエスト送信
sockout.write("POST " + targetUrl + " HTTP/1.1\n");
sockout.write("Host: " + proxyHost + "\n");
sockout.write("Content-type: application/x-www-form-urlencoded\n");
sockout.write("Content-length: "
+ data.toString().getBytes().length+ "\n\n");
sockout.write(data + "\n");
sockout.flush();
// HTTPレスポンス受信 (ヘッダーは除外する)
String inputLine;
boolean header_flg = false;
while ((inputLine = sockin.readLine()) != null) {
if (inputLine.equals("")) {
header_flg = true;
}
if (header_flg) {
responseBody.append(inputLine);
}
}
// ソケットのクローズ
sockout.close();
sockin.close();
sock.close();
} catch (UnknownHostException e) {
log.error("プロキシサーバの名前解決ができません。", e);
throw new Exception();
} catch (IOException e) {
log.error("HTTP通信処理で障害が発生しました。", e);
throw new Exception();
}
return responseBody.toString();
}
}
業務では、まだjdk1.3.1以前を使っているところも多いかと思います。Socketのような低レベルな処理なら問題も発生しにくいと思います。 |