2

Web プロキシ IP のタイプが HTTP であるか Java で SOCKS4/5 であるかを判断するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

2

私の他の回答のコメントで述べたように、プロキシ サーバーの IP アドレスを知っていて、そのタイプを検出したい場合は、Java で各プロキシ タイプを試すことができます。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.List;

public class ProxyTest
{
    public static void main(String... args)
    throws IOException
    {
        InetSocketAddress proxyAddress = new InetSocketAddress("myproxyaddress", 1234);
        Proxy.Type proxyType = detectProxyType(proxyAddress);
        System.out.println(proxyAddress + " is a " + proxyType + " proxy.");
    }

    public static Proxy.Type detectProxyType(InetSocketAddress proxyAddress)
    throws IOException
    {
        URL url = new URL("http://www.google.com");
        List<Proxy.Type> proxyTypesToTry = Arrays.asList(Proxy.Type.SOCKS, Proxy.Type.HTTP);

        for (Proxy.Type proxyType : proxyTypesToTry)
        {
            Proxy proxy = new Proxy(proxyType, proxyAddress);

            //Try with SOCKS
            URLConnection connection = null;
            try
            {
                connection = url.openConnection(proxy);

                //Can modify timeouts if default timeout is taking too long
                //connection.setConnectTimeout(1000);
                //connection.setReadTimeout(1000);

                connection.getContent();

                //If we get here we made a successful connection
                return(proxyType);
            }
            catch (SocketException e) //or possibly more generic IOException?
            {
                //Proxy connection failed
            }
        }

        //No proxies worked if we get here
        return(null);
    }
}

このコードでは、最初に SOCKS で myproxyaddress のプロキシを使用して www.google.com への接続を試みます。それが失敗した場合は HTTP プロキシとして使用し、機能したメソッドを返します。機能しなかった場合は null を返します。

于 2011-07-26T23:21:06.510 に答える
1

Java から使用されているプロキシのタイプを判別する場合は、ProxySelectorおよびProxyを使用できます。

例えば

import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.List;

public class ProxyTest
{
    public static void main(String... args)
    {
        System.setProperty("java.net.useSystemProxies", "true");

        List<Proxy> proxyList = ProxySelector.getDefault().select(URI.create("http://www.google.com"));
        if (!proxyList.isEmpty())
        {
            Proxy proxy = proxyList.get(0);
            switch (proxy.type())
            {
                case DIRECT:
                    System.out.println("Direct connection - no proxy.");
                    break;
                case HTTP:
                    System.out.println("HTTP proxy: " + proxy.address());
                    break;
                case SOCKS:
                    System.out.println("SOCKS proxy: " + proxy.address());
                    break;
            }
        }
    }
}
于 2011-07-25T23:13:31.617 に答える