Saat menguji pemrograman soket lagi hari ini, saya tidak dapat terhubung ke jaringan eksternal. Perusahaan menggunakan agen HTTP. Saya tidak mengerti pencarian online, jadi saya menghabiskan banyak waktu belajar. Hanya setelah melihat hubungan yang baik antara protokol HTTP dan TCP yang dapat Anda pahami. Sekarang Anda dapat menggunakan proxy http melalui soket, hasilnya sangat sederhana, tetapi prosesnya sangat sulit.
1. Mari kita berbicara secara singkat tentang HTTP dan TCP (Anda dapat Google sendiri konten tertentu, dan informasinya sangat lengkap). Berikut adalah poin -poin utama:
HTTP: Ini adalah protokol lapisan aplikasi, berdasarkan protokol lapisan transport.
TCP: Ini adalah protokol lapisan transport, berdasarkan protokol lapisan jaringan.
IP: Ini adalah protokol lapisan jaringan.
Koneksi TCP membutuhkan tiga jabat tangan (seperti mentransfer pendaftaran rumah tangga, tidak terperinci). format konten. Misalnya, jika seseorang mengatakan "SB" (nama Anda), Anda menjawab "ya", itu hanya format konten, dan itu tidak mengubah metode transmisi suara (ditransmisikan melalui gelombang suara <medium perangkat keras jaringan>, melalui bahasa Bahwa kedua belah pihak dapat memahami. Demikian pula, FTP dan Telnet juga merupakan protokol lapisan-lapisan.
2. Setelah menyadari hal di atas, mari kita bicara tentang proxy http. Server. Lalu server proxy http ini meminta alamat akhir yang ingin Anda akses dan memberikan respons kepada Anda. Perlu juga dicatat di sini bahwa itu memberikan protokol HTTP, dan HTTP didasarkan pada TCP, yang berarti bahwa server ini memberikan koneksi TCP dengan format konten HTTP yang ditentukan. Ini membosankan untuk melanjutkan, lihat kode berikut:
Salinan kode adalah sebagai berikut:
// Alamat berikut adalah alamat server proxy
Soket soket = soket baru ("10.1.2.188", 80);
// Konten yang ditulis dan tertulis adalah konten yang mengikuti format protokol permintaan http, meminta Baidu
socket.getoutputStream (). write (string baru ("Dapatkan http://www.baidu.com/ http/1.1/r/n/r/n"). getBytes ());
byte [] bs = byte baru [1024];
InputStream adalah = socket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (string baru (BS, 0, i));
}
is.close ();
Tentu saja, di Java, ada proxy proxy untuk menjelajahi internet.
Salinan kode adalah sebagai berikut:
// Atur proxy
System.setProperty ("http.proxyset", "true");
System.setProperty ("http.proxyhost", "10.1.2.188");
System.setProperty ("http.proxyport", "80");
// langsung mengakses alamat tujuan
Url url = url baru ("http://www.baidu.com");
Urlconnection con = url.openconnection ();
InputStreamReader isr = inputStreamReader baru (con.getInputStream ());
char [] cs = char baru [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (string baru (cs, 0, i));
}
isr.close ();
Akhirnya, mari kita ringkas:
Di lingkungan menggunakan proxy http,
Jika Anda menggunakan Socket (TCP) untuk terhubung ke jaringan eksternal, Anda akan langsung terhubung ke server proxy dan kemudian menentukan URL jaringan eksternal untuk meneruskan dalam permintaan HTTP yang dikirim.
Jika Anda menggunakan URL (http) untuk terhubung ke jaringan eksternal, Anda perlu mengatur parameter proxy http atau menggunakan proxy.
Oke, Anda dapat menggunakannya sesuka Anda setelah Anda mengerti.
Salinan kode adalah sebagai berikut:
Socketchannel sc = socketchannel.open (inetsocketaddress baru ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). encode ("dapatkan 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.forname ("UTF8"). Decode (buffer));
buffer.clear ();
}
sc.close ();
Contoh Menambahkan Proxy ke Pemrograman Soket Java
Terkadang jaringan kami tidak dapat terhubung langsung ke jaringan eksternal. Properti untuk menyelesaikan pengaturan proxy, metode ini relatif sederhana, tetapi tidak mungkin untuk mengatur proxy untuk koneksi terpisah:
Salinan kode adalah sebagai berikut:
public static void main (string [] args) {
Properti prop = system.getProperties ();
// Atur alamat server proxy untuk digunakan saat mengakses http
prop.setProperty ("http.proxyhost", "192.168.0.254");
// Atur port HTTP Access ke server proxy untuk digunakan
prop.setProperty ("http.proxyport", "8080");
// Mengatur host yang tidak perlu diakses melalui server proxy.
prop.setProperty ("http.nonproxyhosts", "localhost | 192.168.0.*");
// Atur alamat server proxy dan port untuk akses yang aman
// tidak memiliki properti https.nonproxyhosts, diakses sesuai dengan aturan yang ditetapkan dalam http.nonproxyhosts
prop.setProperty ("https.proxyhost", "192.168.0.254");
prop.setProperty ("https.proxyport", "443");
// host, port yang menggunakan server dan host proxy ftp yang tidak memerlukan server proxy ftp
prop.setProperty ("ftp.proxyhost", "192.168.0.254");
prop.setProperty ("ftp.proxyport", "2121");
prop.setProperty ("ftp.nonproxyhosts", "localhost | 192.168.0.*");
// Alamat dan port dari server proxy Socks
prop.setProperty ("socksproxyhost", "192.168.0.254");
prop.setProperty ("socksproxyport", "8000");
// Atur nama pengguna dan kata sandi untuk masuk ke server proxy
Authenticator.setDefault (myAuthenticator baru ("nama pengguna", "kata sandi"));
}
Kelas statis myAuthenticator memperluas authenticator {
private string user = "";
Private String Password = "";
MyAuthenticator publik (Pengguna String, Kata Sandi String) {
this.user = pengguna;
this.password = kata sandi;
}
kata sandi yang dilindungi getPasswordAuthentication () {
ReturnNew PasswordAuthentication (User, Password.tochararray ());
}
}
Metode 2 menggunakan proxy untuk mengimplementasikan proxy untuk setiap koneksi. merepotkan untuk mengatur:
Salinan kode adalah sebagai berikut:
public static void main (string [] args) {
mencoba {
Url url = url baru ("http://www.baidu.com");
// Buat server proxy
Inetsocketaddress addr = inetsocketaddress baru ("192.168.0.254",
8080);
// proxy proxy = proxy baru (proxy.type.socks, addr);
Proxy proxy = proxy baru (proxy.type.http, addr);
// Jika kita tahu nama server proxy, kita dapat menggunakannya secara langsung
// Menyelesaikan
Urlconnection conn = url.openconnection (proxy);
InputStream in = conn.getInputStream ();
// inputstream in = url.openstream ();
String s = ioutils.tostring (in);
System.out.println (s);
} catch (Exception e) {
e.printstacktrace ();
}
}