Lorsque je teste à nouveau la programmation de socket aujourd'hui, je ne peux pas me connecter au réseau externe. L'entreprise utilise l'agent HTTP. Je n'ai pas compris la recherche en ligne, alors j'ai passé beaucoup de temps à étudier. Ce n'est qu'après avoir vu la bonne relation entre les protocoles HTTP et TCP que vous pouvez comprendre. Maintenant que vous pouvez utiliser le proxy HTTP via Socket, le résultat est très simple, mais le processus est très difficile.
1. Parlons brièvement de HTTP et TCP (vous pouvez vous-même sur Google le contenu spécifique, et les informations sont très complètes).
HTTP: Il s'agit d'un protocole de couche d'application, basé sur le protocole de couche de transport.
TCP: Il s'agit d'un protocole de couche de transport, basé sur le protocole de couche réseau.
IP: Il s'agit d'un protocole de couche réseau.
Une connexion TCP nécessite trois poignées de main (tout comme le transfert d'un enregistrement des ménages, non détaillé). Format de contenu. Par exemple, si quelqu'un dit "SB" (votre nom), vous répondez "oui", c'est juste le format de contenu, et il ne change pas la méthode de transmission du son (transmis via des ondes sonores < Que les deux parties peuvent comprendre. De même, FTP et Telnet sont également un protocole d'application-couche.
2. Après avoir réalisé ce qui précède, parlons du proxy HTTP. serveur. Il convient également de noter ici qu'il proxys le protocole HTTP, et HTTP est basé sur TCP, ce qui signifie que ce serveur proxys la connexion TCP avec le format de contenu HTTP spécifié. Il est ennuyeux de continuer, examiner le code suivant:
La copie de code est la suivante:
// L'adresse suivante est l'adresse du serveur proxy
Socket socket = new socket ("10.1.2.188", 80);
// Le contenu écrit et écrit est un contenu qui suit le format de protocole de demande HTTP, demande Baidu
socket.getOutputStream (). Write (new String ("Get http://www.baidu.com/ http / 1.1 / r / n / r / n"). getBytes ());
octet [] bs = nouveau octet [1024];
InputStream est = socket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (nouvelle chaîne (bs, 0, i));
}
is.close ();
Bien sûr, dans Java, il y a un proxy proxy pour surfer sur Internet.
La copie de code est la suivante:
// définir le proxy
System.SetProperty ("http.proxyset", "true");
System.SetProperty ("http.proxyhost", "10.1.2.188");
System.SetProperty ("http.proxyport", "80");
// accéder directement à l'adresse de destination
Url url = new URL ("http://www.baidu.com");
UrlConnection con = url.openconnection ();
InputStreamReader ISR = new inputStreamReader (con.getInputStream ());
char [] cs = nouveau char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (nouvelle chaîne (cs, 0, i));
}
isr.close ();
Enfin, résumons:
Dans un environnement utilisant le proxy HTTP,
Si vous utilisez Socket (TCP) pour vous connecter au réseau externe, vous vous connectez directement au serveur proxy, puis spécifiez l'URL du réseau externe à transférer dans la demande HTTP envoyée.
Si vous utilisez URL (HTTP) pour vous connecter au réseau externe, vous devez définir des paramètres proxy HTTP ou utiliser le proxy.
OK, vous pouvez l'utiliser comme vous le souhaitez après avoir compris.
La copie de code est la suivante:
Socketchannel sc = socketchannel.open (new IneTsocketAddress ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). Encode ("Get http://www.baidu.com/ http / 1.1 / r / n / r / n"));
ByteBuffer Buffer = ByteBuffer.AllOcy (1024);
while (sc.read (tampon)! = -1) {
buffer.flip ();
System.out.println (charset.forname ("UTF8"). Decode (tampon));
buffer.clear ();
}
sc.close ();
Exemple d'ajout de proxy à la programmation Java Socket
Parfois, notre réseau ne peut pas être connecté directement au réseau externe. Propriétés Pour terminer la configuration de la proxy, cette méthode est relativement simple, mais il n'est pas possible de configurer un proxy pour une connexion distincte:
La copie de code est la suivante:
public static void main (String [] args) {
Propriétés Prop = System.getProperties ();
// Définissez l'utilisation de l'adresse du serveur proxy lors de l'accès à HTTP
Prop.setProperty ("http.proxyhost", "192.168.0.254");
// Définissez le port de l'accès HTTP au serveur proxy à utiliser
Prop.SetProperty ("http.proxyport", "8080");
// configure un hôte qui n'a pas besoin d'être accessible via un serveur proxy.
Prop.setProperty ("http.NonProxyHosts", "LocalHost | 192.168.0. *");
// Définissez l'adresse et le port du serveur proxy pour un accès sécurisé
// Il n'a pas la propriété https.NonproxyHosts, il est accessible en fonction des règles définies dans http.NonproxyHosts
Prop.setProperty ("https.proxyhost", "192.168.0.254");
Prop.SetProperty ("https.proxyport", "443");
// hôtes, ports qui utilisent des serveurs proxy FTP et des hôtes qui ne nécessitent pas de serveurs proxy FTP
prop.setproperty ("ftp.proxyhost", "192.168.0.254");
prop.setProperty ("ftp.proxyport", "2121");
Prop.setProperty ("FTP.NONPROXYHOSTS", "LocalHost | 192.168.0. *");
// L'adresse et le port du serveur proxy de chaussettes
Prop.setProperty ("SOCKSPROXYHOST", "192.168.0.254");
Prop.SetProperty ("socksproxyport", "8000");
// Définissez le nom d'utilisateur et le mot de passe pour vous connecter au serveur proxy
Authenticator.setDefault (new myAuthenticator ("username", "mot de passe"));
}
MyAuthenticatrice de classe statique étend Authenticator {
chaîne privée User = "";
Private String Password = "";
public myAuthenticator (chaîne utilisateur, mot de passe de chaîne) {
this.user = utilisateur;
this.password = mot de passe;
}
Protégé de PasswordAuthentication GetPasswordAuthentication () {{
returnNew PasswordAuthentication (utilisateur, mot de passe.toCharArray ());
}
}
La méthode 2 utilise le proxy pour implémenter le proxy pour chaque connexion. PROPRIÉTÉ À RÉGLER:
La copie de code est la suivante:
public static void main (String [] args) {
essayer {
Url url = new URL ("http://www.baidu.com");
// Créer un serveur proxy
InetsocketAddress addr = new InetsocketAddress ("192.168.0.254",
8080);
// proxy proxy = new proxy (proxy.type.socks, addr);
Proxy proxy = new proxy (proxy.type.http, addr);
// Si nous connaissons le nom du serveur proxy, nous pouvons l'utiliser directement
// Finition
URLConnection Conn = URL.OpenConnection (proxy);
InputStream dans = conn.getInputStream ();
// inputStream dans = url.openStream ();
String s = ioutils.toString (in);
System.out.println (s);
} catch (exception e) {
e.printStackTrace ();
}
}