はじめに
今時のプロキシはConnectすると生データがそのまま通せるので、普通のSocketでもプロキシが使える。
プロキシサーバの設定
とりあえず普通に指定する場合、Proxyのコンストラクタでアドレスを指定すれば良い。
Proxy px = null;
try {
InetSocketAddress px_addr = new InetSocketAddress("プロキシサーバのアドレス", 3128);
px = new Proxy(Proxy.Type.HTTP, px_addr);
}
catch (Exception e) {
// エラー処理
}
Socket生成
SocketのコンストラクタでProxyが指定できるようになっている。作ったら普通にconnectすれば良い。
Socket sock = null;
try {
sock = new Socket(px);
InetSocketAddress con_addr = new InetSocketAddress("接続したいサーバのアドレス", ポート番号);
sock.connect(con_addr);
}
catch (Exception e) {
// エラー処理
}
SSLSocketで使いたい場合
SSLSocketFactory の createSocket で元になるSocketが指定できる。なので、上で生成したSocketを使って以下のようにすれば良い。
SSLSocket ssl_sock = null;
try {
SSLContext ctx = SSLContext.getDefault();
SSLSocketFactory factory = ctx.getSocketFactory();
// 最後の false は autoClose
ssl_sock = (SSLSocket)factory.createSocket(con_sock, "接続したいサーバのアドレス", ポート番号, false);
// やらなくてもいいはずだけど、一応
ssl_sock.startHandshake();
}
catch (Exception e) {
// エラー処理
}
認証が必要なプロキシ
java.net.Authenticator を使うと認証の処理をしてくれる。まずは Authenticator を継承したクラスが必要。
一番簡単なのはこんな感じ。
ユーザ名・パスワードを外から入れられるようにすれば使える。
class TestAuthenticator extends Authenticator
{
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("ユーザ名", "パスワード".toCharArray());
}
}
この Authenticator を使うように設定するには、Authenticator.setDefault() しておく。
プログラムの最初にこんなのを入れる感じ。
Authenticator.setDefault(new TestAuthenticator());
また、Java標準設定だと、httpでBasic認証してくれない。プロキシサーバがBasic認証の場合に対応するなら、最初に以下のコードを入れておく。
禁止する認証方式を空に設定している。
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
OSに設定されているプロキシサーバの取得
ProxySelector.getDefault() を使う。
Java標準設定ではOFFになっているので、まずは以下のようにしてONに設定する。
System.setProperty("java.net.useSystemProxies", "true");
そうすると ProxySelector.getDefault() で、OS設定の ProxySelector が取得できる。
そこから Proxy の取得までは以下のようになる。複数取得できるが、大抵は1つだと思うので、最初のものを使っている。
OSの設定を取るだけなら、ローカルアドレスとかでなければ大体どこでも同じプロキシサーバを使うので、アクセスしたいURLも適当で大丈夫。
Proxy px = null;
try {
ProxySelector ps = ProxySelector.getDefault();
List<Proxy> px_list = ps.select(new URI("アクセスしたいURL"));
if (!px_list.isEmpty()) {
px = px_list.get(0);
}
}
catch (Exception e) {
// エラー処理
}