Comment utiliser SOCKS en Java?


J'utilise des chaussettes de travail à 100% et je ne peux pas me connecter via mon application. {[0]}

    try
    {
        HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(pr);
        con.setConnectTimeout(proxyTimeout * 1000);
        con.setReadTimeout(proxyTimeout * 1000);
        con.connect();

        System.out.println(con.usingProxy());
    }
    catch(IOException ex)
    {
        Logger.getLogger(Enter.class.getName()).log(Level.SEVERE, null, ex);
    }

Alors qu'est-ce que je fais de mal? Si je vais utiliser HTTP avec un proxy HTTP, tout fonctionne mais pas avec SOCKS.

Author: CloudyMarble, 2011-04-18

4 answers

C'est vraiment facile. Il vous suffit de définir les propriétés système pertinentes et de continuer avec votre HttpConnection régulière.

System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "socksProxyHost", "127.0.0.1" );
System.getProperties().put( "socksProxyPort", "1234" );
 22
Author: Hamed Momeni, 2012-08-25 14:42:56

Informez les arguments de la machine virtuelle "socksProxyHost" et "socksProxyPort".

Par exemple

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
 5
Author: Marcelo C., 2017-11-30 21:59:11

Http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/net/www/http/HttpClient.java/?v=source

Au fond, HttpClient est utilisé dans HttpURLConnection.

if ((proxy != null) && (proxy.type() == Proxy.Type.HTTP)) {
   sun.net.www.URLConnection.setProxiedHost(host);
   privilegedOpenServer((InetSocketAddress) proxy.address());
   usingProxy = true;
   return;
} else {
   // make direct connection
   openServer(host, port);
   usingProxy = false;
   return;
}

Sur la ligne 476, vous pouvez voir que le seul proxy acceptable est un proxy HTTP. Il fait une connexion directe sinon.

Bizarrement, il n'y a pas de support pour le proxy SOCKS utilisant HttpURLConnection. Pire encore, le code n'utilise même pas un proxy non pris en charge et ignore simplement le proxy!

Pourquoi il n'y a pas de support pour les proxys SOCKS après au moins 10 ans d'existence de cette classe ne peut pas être expliqué.

 2
Author: stackunderflow, 2018-02-17 22:43:31

Ou cette réponse: https://stackoverflow.com/a/64649010/5352325

Si vous savez quels URI doivent aller au proxy, vous pouvez également utiliser le ProxySelector de basse couche: https://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html où pour chaque connexion Socket établie, vous pouvez décider quels proxys doivent être utilisés.

Il ressemble à ceci:

public class MyProxySelector extends ProxySelector {
        ...

        public java.util.List<Proxy> select(URI uri) {
        ...
          if (uri is what I need) {
             return list of my Proxies
          }
        ...
        }
        ...
}
 

Ensuite, vous utilisez votre sélecteur:

public static void main(String[] args) {
        MyProxySelector ps = new MyProxySelector(ProxySelector.getDefault());
        ProxySelector.setDefault(ps);
        // rest of the application
}
 0
Author: Pavol Zibrita, 2020-11-02 16:12:32