1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaのSocketでプロキシを使う

Last updated at Posted at 2022-06-18

はじめに

今時のプロキシは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) {
    // エラー処理
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?