Al probar la programación de socket nuevamente hoy, no puedo conectarme a la red externa. La compañía utiliza el agente HTTP. No entendí la búsqueda en línea, así que pasé mucho tiempo estudiando. Solo después de ver la buena relación entre los protocolos HTTP y TCP puede entender. Ahora que puede usar el proxy HTTP a través del socket, el resultado es muy simple, pero el proceso es muy difícil.
1. Hablemos brevemente sobre HTTP y TCP (puede buscar en Google el contenido específico y la información es muy completa).
HTTP: es un protocolo de capa de aplicación, basado en el protocolo de capa de transporte.
TCP: es un protocolo de capa de transporte, basado en el protocolo de capa de red.
IP: es un protocolo de capa de red.
Una conexión TCP requiere tres apretones de manos (al igual que transferir un registro de hogar, no detallado). Formato de contenido. Por ejemplo, si alguien dice "SB" (su nombre), responde "sí", es solo el formato de contenido y no cambia el método de transmisión de sonido (transmitido a través de ondas de sonido <medio de hardware de red>, a través de idiomas Que ambas partes pueden entender. Del mismo modo, FTP y Telnet también son un protocolo de capa de aplicación.
2. Después de realizar lo anterior, hablemos sobre el proxy HTTP. Servidor. Entonces este servidor proxy HTTP solicita la dirección final a la que desea acceder y le devuelve la respuesta. También debe tenerse en cuenta aquí que proxys el protocolo HTTP, y HTTP se basa en TCP, lo que significa que este servidor proxys la conexión TCP con el formato de contenido HTTP especificado. Es aburrido continuar, mira el siguiente código:
La copia del código es la siguiente:
// La siguiente dirección es la dirección del servidor proxy
Socket Socket = nuevo socket ("10.1.2.188", 80);
// El contenido escrito y escrito es contenido que sigue el formato de protocolo de solicitud HTTP, solicitud Baidu
Socket.getOutputStream (). Write (New String ("Get http://www.baidu.com/ http/1.1/r/n/r/n"). getBytes ());
byte [] bs = nuevo byte [1024];
InputStream es = Socket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (nueva cadena (BS, 0, i));
}
is.close ();
Por supuesto, en Java, hay un proxy para navegar en Internet.
La copia del código es la siguiente:
// Establecer el proxy
System.setProperty ("http.proxyset", "true");
System.SetProperty ("http.proxyhost", "10.1.2.188");
System.SetProperty ("http.proxyport", "80");
// Acceda directamente a la dirección de destino
Url url = nueva url ("http://www.baidu.com");
Urlconnection con = url.openconnection ();
InputStreamReader isr = new InputStreamReader (con.getInputStream ());
char [] cs = nuevo char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (nueva cadena (cs, 0, i));
}
isr.close ();
Finalmente, resumamos:
En un entorno que utiliza proxy http,
Si usa Socket (TCP) para conectarse a la red externa, se conectará directamente al servidor proxy y luego especificará la URL de red externa para reenviar en la solicitud HTTP enviada.
Si usa URL (HTTP) para conectarse a la red externa, debe establecer parámetros de proxy HTTP o usar proxy.
Ok, puede usarlo como desee después de comprender.
La copia del código es la siguiente:
Socketchannel SC = Socketchannel.open (nuevo inetSocketAddress ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). code ("obtener http://www.baidu.com/ http/1.1/r/n/r/n"));
Bytebuffer buffer = bytebuffer.allocate (1024);
while (sc.read (buffer)! = -1) {
buffer.flip ();
System.out.println (charset.forname ("utf8"). Decode (buffer));
buffer.clear ();
}
sc.close ();
Ejemplo de agregar proxy a la programación de socket Java
A veces, nuestra red no puede conectarse directamente a la red externa. Propiedades Para completar la configuración del proxy, este método es relativamente simple, pero no es posible configurar un proxy para una conexión separada:
La copia del código es la siguiente:
public static void main (string [] args) {
Propiedades prop = system.getProperties ();
// Establecer la dirección del servidor proxy para usar al acceder a HTTP
prop.setProperty ("http.proxyhost", "192.168.0.254");
// Establecer el puerto de HTTP Access al servidor proxy para usar
prop.setProperty ("http.proxyport", "8080");
// Configure un host al que no es necesario acceder a través de un servidor proxy.
prop.setProperty ("http.nonproxyhosts", "localhost | 192.168.0.*");
// Establecer la dirección y el puerto del servidor proxy para el acceso seguro
// no tiene la propiedad https.nonproxyhosts, se accede de acuerdo con las reglas establecidas en http.nonproxyhosts
prop.setProperty ("https.proxyhost", "192.168.0.254");
prop.setProperty ("https.proxyport", "443");
// hosts, puertos que usan servidores proxy FTP y hosts que no requieren servidores proxy FTP
prop.setProperty ("ftp.proxyhost", "192.168.0.254");
prop.setProperty ("ftp.proxyport", "2121");
prop.setProperty ("ftp.nonproxyhosts", "localhost | 192.168.0.*");
// La dirección y el puerto del servidor proxy de calcetines
prop.setProperty ("Socksproxyhost", "192.168.0.254");
prop.setProperty ("SockSproxyPort", "8000");
// Establecer el nombre de usuario y la contraseña para iniciar sesión en el servidor proxy
Autenticator.setDefault (nuevo myauthenticator ("nombre de usuario", "contraseña"));
}
Myauthenticator de clase estática extiende el autenticador {
String private String user = "";
String private Password = "";
public myauthenticator (user de cadena, contraseña de cadena) {
this.user = usuario;
this.password = contraseña;
}
protegido PassionAuthentication getPasswordAuthentication () {
returnNew PasswordAuthentication (usuario, contraseña.toCarArray ());
}
}
El método 2 utiliza proxy para implementar proxy para cada conexión. problemático de establecer:
La copia del código es la siguiente:
public static void main (string [] args) {
intentar {
Url url = nueva url ("http://www.baidu.com");
// crear un servidor proxy
InetSocketAddress addr = new inetSocketAddress ("192.168.0.254",
8080);
// proxy proxy = nuevo proxy (proxy.type.socks, addr);
Proxy proxy = nuevo proxy (proxy.type.http, addr);
// Si sabemos el nombre del servidor proxy, podemos usarlo directamente
// Finalizar
Urlconnection conn = url.openconnection (proxy);
InputStream in = conn.getInputStream ();
// InputStream in = url.openStream ();
Cadena s = ioutils.toString (in);
System.out.println (s);
} Catch (Exception e) {
E.PrintStackTrace ();
}
}