2009-10-17 7 views
3

J'essaie de trouver un moyen de forcer toute tentative de connexion d'un Jar à une adresse IP externe via mon serveur proxy, qui s'exécute sur localhost (également une application Java). Une fois que le serveur proxy reçoit la connexion, il ouvre une connexion avec l'adresse IP externe et commence à acheminer l'E/S vers et depuis le client/serveur.Options de lancement pour forcer les connexions de socket Java vers localhost?

J'ai été Google sur ce pendant 2 jours, et je n'ai pas eu de chance, je crois que j'utilise les mauvais termes dans mes tentatives de recherche.

Si vous avez des idées, s'il vous plaît faites le moi savoir, je vais essayer n'importe quoi.

Merci d'avance. - Sean.

+0

La même chose est discutée ici: http://stackoverflow.com/questions/1432961/how-do-i-make-httpurlconnection-use-a-proxy –

Répondre

4

Si est qu'un « vrai » proxy, vous pouvez le spécifier le proxy à utiliser en utilisant ja va les propriétés du système.

Vous avez deux alternatives:

  1. Spécifiez le proxy dans la ligne de commande
  2. hardcode dans votre application

Eh bien, vous avez en fait trois

  1. Spécifiez un fichier .properties, puis lisez-le et définissez-le en tant que propriété système (qui est à peu près l'option 2 mais plus dynamique)

ligne de commande que vous utilisez:

java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -jar YourJar.jar 

Avec que toutes les connexions HTTP que vous effectuez passera par localhost au port de 8080

Le deuxième est d'ajouter ceci à la principale méthode de votre programme:

public static void main(String [] args) { 
    System.setProperty("http.proxyHost", "localhost"); 
    System.setProperty("http.proxyPort", "8080"); 
    ..... 
} 

Qui fait la même chose.

chargement Enfin de myapp.properties

public static void main(String [] args) { 
    try { // there are cleaner ways of course 
     ResorceBundle bundle = ResourceBundle.getBundle("myapp"); 
     System.setProperty("http.proxyHost", bundle.getString("proxy.server")); 
     System.setProperty("http.proxyPort", bundle.getString("proxy.port")); 
    } catch(MissingResourceException missingResourceException){} 
    .... 
} 

Il vous suffit de vous assurer que myapp.properties est disponible à partir du classpath

Plus d'informations sur cette fonctionnalité here

1

Si vous demandez au sujet général (PAS HTTP/FTP spécifique!) par l'intermédiaire de connexions Socket, la réponse simple est qu'elle n'est pas supportée par Java.

Lorsque vous configurez un proxy pour le trafic HTTP et FTP, le proxy est exécuté au niveau du protocole d'application. Les propriétés de proxy côté Java indiquent à la couche URLConnection de se connecter à votre proxy désigné plutôt que l'adresse IP à partir de l'URL à laquelle votre application tente de se connecter. Le niveau Java Socket ne sait pas que cela se produit. Il voit juste une demande de connexion au proxy.

Ce travail car les protocoles HTTP et FTP prennent spécifiquement en charge le proxy. Par exemple, la première ligne d'un message de requête HTTP GET donne l'URL complète de la page demandée par le client. Si la requête GET va à un proxy, le proxy peut déterminer où il doit l'envoyer. En ce qui concerne le problème du proxy au niveau Socket, la première observation est que les bibliothèques de classes Java standard ne le supportent pas. La deuxième observation est que c'est en fait inexécutable ... à moins que vous ne l'implémentiez comme couche de transport alternative. La raison en est que IP et TCP/IP ne supportent tout simplement pas la notion de proxy/relais de messages/flux explicitement. Et même si vous avez implémenté un tel transport, il ne rentre pas dans le modèle Socket standard.

Donc, si vous êtes vraiment poser des questions sur le mandatement tous du trafic réseau pour une application Java, cela ne peut être mis en œuvre en dehors de la machine virtuelle Java; c'est-à-dire au niveau du transport réseau du système d'exploitation hôte (physique ou virtuel) de la JVM.

+0

Je ne suis pas complètement d'accord avec cela. Depuis Java 1.5, il existe un support intégré pour les proxys SOCKS (voir le constructeur 'java.net.Socket (Proxy proxy)'). Mais, oui, pour le protocole HTTP, il faut une couche supplémentaire qui le gérera. Les développeurs Apache 'commons-httpclient' promettent d'ajouter ce support dans la version 4.x de la bibliothèque (voir http://wiki.apache.org/HttpComponents/FrequentlyAskedApplicationDesignQuestions#Proxy_Configuration). –

+0

Et ... oui ... il y a un support complet du proxy (au moins en Java 6 et pour HTTP et FTP). Voir 'sun.net.www.protocol.ftp.FtpURLConnection # connect()' et 'sun.net.www.protocol.http.HttpURLConnection # plainConnect()'. Plus le support pour l'authentification. –

Questions connexes