Beim Testen von Socket -Programmieren heute kann ich keine Verbindung zum externen Netzwerk herstellen. Das Unternehmen verwendet HTTP -Agenten. Ich habe die Suche online nicht verstanden, also habe ich viel Zeit damit verbracht, zu studieren. Erst wenn Sie die gute Beziehung zwischen HTTP- und TCP -Protokollen gesehen haben, können Sie verstehen. Nachdem Sie HTTP -Proxy über Socket verwenden können, ist das Ergebnis sehr einfach, aber der Prozess ist sehr schwierig.
1. Lassen Sie uns kurz über HTTP und TCP sprechen (Sie können den spezifischen Inhalt selbst googeln, und die Informationen sind sehr vollständig).
HTTP: Es handelt sich um ein Anwendungsschichtprotokoll, das auf dem Transportschichtprotokoll basiert.
TCP: Es handelt sich um ein Transportschichtprotokoll, das auf dem Netzwerkschichtprotokoll basiert.
IP: Es ist ein Netzwerkschichtprotokoll.
Eine TCP -Verbindung erfordert drei Handshakes (genau wie die Übertragung einer Haushaltsregistrierung, nicht detailliert). Inhaltsformat. Wenn beispielsweise jemand "SB" (Ihr Name) sagt, antworten Sie mit "Ja", es ist nur das Inhaltsformat und ändert die Klangmethode nicht (über die Klangwellen <Netzwerkhardware -Medium> über Sprachen übertragen. Dass beide Parteien verstehen können. In ähnlicher Weise sind FTP und Telnet auch ein Anwendungsschichtprotokoll.
2. Nachdem Sie das oben genannte realisiert haben, sprechen wir über den HTTP -Proxy. Server. Hier sollte auch beachtet werden, dass es das HTTP -Protokoll proxiert, und HTTP basiert auf TCP, was bedeutet, dass dieser Server die TCP -Verbindung mit dem angegebenen HTTP -Inhaltsformat proxiert. Es ist langweilig, weiterzumachen und den folgenden Code anzusehen:
Die Codekopie lautet wie folgt:
// Die folgende Adresse ist die Adresse des Proxy -Servers
Socket Socket = New Socket ("10.1.2.188", 80);
// Der geschriebene und geschriebene Inhalt ist der Inhalt, der dem HTTP -Anfrage -Protokollformat folgt, Baidu anfordern
Socket.GetOutputStream (). Schreiben (neue String ("Get http://www.baidu.com/ http/1.1/r/r/r/n"). getBytes ());
Byte [] BS = neues Byte [1024];
InputStream ist = Socket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (neue String (BS, 0, I));
}
IS.CLOSE ();
Natürlich gibt es in Java einen Proxy -Proxy, um das Internet zu surfen.
Die Codekopie lautet wie folgt:
// Setzen Sie den Proxy
System.setProperty ("http.proxyset", "true");
System.setProperty ("http.proxyhost", "10.1.2.188");
System.setProperty ("http.proxyport", "80");
// Zugriff direkt auf die Zieladresse zugreifen
URL URL = New URL ("http://www.baidu.com");
UrlConnection con = url.openconnection ();
InputStreamReader ISR = NEU InputStreamReader (con.getInputStream ());
char [] cs = new char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (neue String (cs, 0, i));
}
isr.close ();
Lassen Sie uns schließlich zusammenfassen:
In einer Umgebung mit HTTP -Proxy,
Wenn Sie Socket (TCP) verwenden, um eine Verbindung zum externen Netzwerk herzustellen, stellen Sie direkt eine Verbindung zum Proxy -Server her und geben die externe Netzwerk -URL an, um in der gesendeten HTTP -Anforderung weiterzuleiten.
Wenn Sie URL (HTTP) verwenden, um eine Verbindung zum externen Netzwerk herzustellen, müssen Sie HTTP -Proxy -Parameter festlegen oder Proxy verwenden.
OK, Sie können es verwenden, wie Sie es möchten, nachdem Sie den folgenden Code verstanden haben, ein Beispiel für die Verwendung von NIO -Socket, um über HTTP -Proxy auf das externe Netzwerk zuzugreifen:
Die Codekopie lautet wie folgt:
Socketchannel sc = socketchannel.open (New Inetsocketaddress ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). codode ("Get http://www.baidu.com/ http/1.1/r/n/r/n"));
Bytebuffer buffer = bytebuffer.alcode (1024);
while (sc.read (puffer)! = -1) {
puffer.flip ();
System.out.println (charset.forname ("utf8"). Decode (puffer));
buffer.clear ();
}
sc.close ();
Beispiel für das Hinzufügen von Proxy zu Java Socket -Programmierung
Manchmal kann unser Netzwerk nicht direkt mit dem externen Netzwerk verbunden werden. Eigenschaften zum Abschluss der Einrichtung der Proxy. Diese Methode ist relativ einfach, aber es ist nicht möglich, einen Proxy für eine separate Verbindung einzurichten:
Die Codekopie lautet wie folgt:
public static void main (String [] args) {
Eigenschaften prop = system.getProperties ();
// Stellen Sie die Adresse des Proxy -Servers für den Zugriff auf HTTP ein
prop.setProperty ("http.proxyhost", "192.168.0.254");
// Setzen Sie den Port des HTTP -Zugriffs auf den zum verwendeten Proxy -Server fest
prop.setProperty ("http.proxyport", "8080");
// Richten Sie einen Host ein, auf den nicht über einen Proxy -Server zugegriffen werden muss.
prop.setProperty ("http.nonproxyhosts", "localhost | 192.168.0.*");
// Setzen Sie die Proxy -Serveradresse und den Port für einen sicheren Zugriff fest
// Es gibt nicht die Eigenschaft mit https.nonproxyhosts, auf sie wird gemäß den in http.nonproxyhosts festgelegten Regeln zugegriffen
prop.setProperty ("https.proxyhost", "192.168.0.254");
prop.setProperty ("https.proxyport", "443");
// Hosts, Ports, die FTP -Proxy -Server verwenden, und Hosts, für die keine FTP -Proxy -Server erforderlich sind
prop.setProperty ("ftp.proxyhost", "192.168.0.254");
prop.setProperty ("ftp.proxyport", "2121");
prop.setProperty ("ftp.nonproxyhosts", "localhost | 192.168.0.*");
// Die Adresse und der Port des Socken -Proxy -Servers
prop.setProperty ("Sockproxyhost", "192.168.0.254");
prop.setProperty ("Sockproxyport", "8000");
// Setzen Sie den Benutzernamen und das Passwort, um sich beim Proxy -Server anzumelden
Authenticator.setDefault (neuer Myauthenticator ("Benutzername", "Passwort"));
}
Statische Klasse MyAuthenticator erweitert den Authentikator {
private String user = "";
private String password = "";
public myAuthenticator (String -Benutzer, String -Passwort) {
this.user = user;
this.Password = Passwort;
}
geschützte passwordauthentication getPasswordAuthentication () {
returnNew passwordAuthentication (Benutzer, Passwort.toCharArray ());
}
}
Methode 2 verwendet Proxy, um Proxy für jede Verbindung zu implementieren. störend zu setzen:
Die Codekopie lautet wie folgt:
public static void main (String [] args) {
versuchen {
URL URL = New URL ("http://www.baidu.com");
// Erstellen Sie einen Proxy -Server
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);
// Wenn wir den Namen des Proxy -Servers kennen, können wir ihn direkt verwenden
// Beenden
UrlConnection conn = url.openconnection (Proxy);
InputStream in = conn.getInputStream ();
// InputStream in = url.openstream ();
String S = ioutils.toString (in);
System.out.println (s);
} catch (Ausnahme e) {
E. printstacktrace ();
}
}