Ao testar a programação do soquete novamente hoje, não posso me conectar à rede externa. A empresa usa agente HTTP. Não entendi a pesquisa on -line, então passei muito tempo estudando. Somente depois de ver o bom relacionamento entre os protocolos HTTP e TCP, você pode entender. Agora que você pode usar o proxy HTTP através do soquete, o resultado é muito simples, mas o processo é muito difícil.
1. Vamos falar brevemente sobre HTTP e TCP (você pode pesquisar no Google o conteúdo específico e as informações estão muito completas).
HTTP: É um protocolo de camada de aplicação, com base no protocolo da camada de transporte.
TCP: É um protocolo de camada de transporte, com base no protocolo da camada de rede.
IP: É um protocolo de camada de rede.
Uma conexão TCP requer três apertos de mão (assim como a transferência de um registro doméstico, não detalhado). Formato de conteúdo. Por exemplo, se alguém disser "sb" (seu nome), você responde "sim", é apenas o formato de conteúdo e não altera o método de transmissão de som (transmitido através de ondas sonoras <hardware de rede>, através de linguagens Que ambas as partes podem entender. Da mesma forma, FTP e Telnet também são um protocolo da camada de aplicativo.
2. Depois de perceber o exposto, vamos falar sobre o proxy HTTP. servidor. Deve -se notar também que proxy o protocolo HTTP, e o HTTP é baseado no TCP, o que significa que esse servidor prove a conexão TCP com o formato de conteúdo HTTP especificado. É chato continuar, observe o seguinte código:
A cópia do código é a seguinte:
// O seguinte endereço é o endereço do servidor proxy
Soquete soquete = novo soquete ("10.1.2.188", 80);
// O conteúdo escrito e escrito é conteúdo que segue o formato de protocolo de solicitação HTTP, solicitação Baidu
socket.getOutputStream (). write (new String ("Obtenha http://www.baidu.com/ http/1.1/r/n/r/n"). getBytes ());
byte [] bs = novo byte [1024];
InputStream é = soket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (new String (BS, 0, i));
}
is.close ();
Obviamente, em Java, há um proxy proxy para navegar na Internet.
A cópia do código é a seguinte:
// Defina o proxy
System.setProperty ("http.proxyset", "true");
System.setProperty ("http.proxyhost", "10.1.2.188");
System.setProperty ("http.proxyport", "80");
// Acesse diretamente o endereço de destino
Url url = new url ("http://www.baidu.com");
UrlConnection con = url.openconnection ();
InputStreamReader ISR = new InputStreamReader (Con.getInputStream ());
char [] cs = novo char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (new String (cs, 0, i));
}
isr.close ();
Finalmente, vamos resumir:
Em um ambiente usando proxy HTTP,
Se você usar o Socket (TCP) para conectar -se à rede externa, você se conectará diretamente ao servidor proxy e especificará o URL de rede externo para encaminhar na solicitação HTTP enviada.
Se você usa URL (HTTP) para se conectar à rede externa, precisará definir parâmetros de proxy HTTP ou usar proxy.
OK, você pode usá -lo como quiser depois de entender.
A cópia do código é a seguinte:
Socketchannel sc = socketchannel.open (new inetSocketAddress ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). Encode ("obtenha http://www.baidu.com/ http/1.1/r/n/r/n"));
Buffer bytebuffer = bytebuffer.Allocate (1024);
while (sc.read (buffer)! = -1) {
buffer.flip ();
System.out.println (charset.formoname ("utf8"). Decodge (buffer));
buffer.clear ();
}
sc.close ();
Exemplo de adição de proxy à programação do soquete Java
Às vezes, nossa rede não pode ser conectada diretamente à rede externa. Propriedades Para concluir a configuração de proxy, esse método é relativamente simples, mas não é possível configurar um proxy para uma conexão separada:
A cópia do código é a seguinte:
public static void main (string [] args) {
Propriedades prop = System.getProperties ();
// Defina o endereço do servidor proxy a ser usado ao acessar o HTTP
Prop.SetProperty ("http.proxyhost", "192.168.0.254");
// Defina a porta de acesso HTTP ao servidor proxy para usar
Prop.setProperty ("http.proxyport", "8080");
// Configure um host que não precisa ser acessado por meio de um servidor proxy.
Prop.setProperty ("http.nonproxyhosts", "localhost | 192.168.0.*");
// Defina o endereço e a porta do servidor proxy para acesso seguro
// não possui a propriedade https.nonproxyhosts, é acessada de acordo com as regras estabelecidas em http.nonproxyhosts
Prop.SetProperty ("https.proxyhost", "192.168.0.254");
Prop.setProperty ("https.proxyport", "443");
// hosts, portas que usam servidores e hosts proxy FTP que não requerem servidores proxy FTP
Prop.SetProperty ("ftp.proxyhost", "192.168.0.254");
Prop.setProperty ("ftp.proxyport", "2121");
Prop.SetProperty ("ftp.nonproxyhosts", "localhost | 192.168.0.*");
// O endereço e a porta do servidor proxy de meias
Prop.SetProperty ("SocksProxyHost", "192.168.0.254");
Prop.setProperty ("SocksProxyport", "8000");
// Defina o nome de usuário e a senha para fazer login no servidor proxy
Autenticator.setDefault (New MyAuthenticator ("Nome de usuário", "Senha"));
}
classe estática myauthenticator estende o autenticador {
String private String user = "";
private string senha = "";
public myauthenticator (usuário da string, senha da string) {
this.User = usuário;
this.password = senha;
}
Protected PasswordAuthentication getPasswordAuthentication () {
returnNew PasswordAuthentication (usuário, senha.toCharArray ());
}
}
O método 2 usa proxy para implementar o proxy para cada conexão. problemático para definir:
A cópia do código é a seguinte:
public static void main (string [] args) {
tentar {
Url url = new url ("http://www.baidu.com");
// Crie um servidor proxy
InetSocketAddress addr = new inetSocketAddress ("192.168.0.254",
8080);
// proxy proxy = novo proxy (proxy.type.socks, addr);
Proxy proxy = novo proxy (proxy.type.http, addr);
// Se soubermos o nome do servidor proxy, podemos usá -lo diretamente
// Terminar
UrlConnection Conn = url.openconnection (proxy);
InputStream in = Conn.getInputStream ();
// inputStream em = url.openstream ();
String s = ioutils.toString (in);
System.out.println (s);
} catch (Exceção e) {
E.PrintStackTrace ();
}
}