เมื่อทดสอบการเขียนโปรแกรมซ็อกเก็ตอีกครั้งในวันนี้ฉันไม่สามารถเชื่อมต่อกับเครือข่ายภายนอกได้ บริษัท ใช้ตัวแทน HTTP ฉันไม่เข้าใจการค้นหาทางออนไลน์ดังนั้นฉันจึงใช้เวลาเรียนมาก หลังจากเห็นความสัมพันธ์ที่ดีระหว่างโปรโตคอล HTTP และ TCP คุณจะเข้าใจได้ ตอนนี้คุณสามารถใช้พร็อกซี HTTP ผ่านซ็อกเก็ตผลลัพธ์นั้นง่ายมาก แต่กระบวนการนั้นยากมาก
1. พูดคุยสั้น ๆ เกี่ยวกับ HTTP และ TCP (คุณสามารถให้ Google เนื้อหาที่เฉพาะเจาะจงด้วยตัวเองและข้อมูลเสร็จสมบูรณ์มาก) นี่คือประเด็นสำคัญ:
HTTP: มันเป็นโปรโตคอลเลเยอร์แอปพลิเคชันตามโปรโตคอลการขนส่งเลเยอร์
TCP: มันเป็นโปรโตคอลเลเยอร์การขนส่งตามโปรโตคอลเลเยอร์เครือข่าย
IP: มันเป็นโปรโตคอลเลเยอร์เครือข่าย
การเชื่อมต่อ TCP ต้องการการจับมือสามครั้ง (เช่นเดียวกับการถ่ายโอนการลงทะเบียนในครัวเรือนซึ่งไม่ได้มีรายละเอียด) รูปแบบเนื้อหา ตัวอย่างเช่นหากมีคนพูดว่า "SB" (ชื่อของคุณ) คุณตอบว่า "ใช่" มันเป็นเพียงรูปแบบเนื้อหาและไม่เปลี่ยนวิธีการส่งสัญญาณของเสียง (ส่งผ่านคลื่นเสียง <สื่อฮาร์ดแวร์เครือข่าย> ผ่านภาษา ที่ทั้งสองฝ่ายสามารถเข้าใจได้ ในทำนองเดียวกัน FTP และ Telnet ยังเป็นโปรโตคอลแอปพลิเคชันชั้น
2. หลังจากตระหนักถึงข้างต้นเรามาพูดถึง HTTP Proxy เซิร์ฟเวอร์ ควรสังเกตที่นี่ว่ามันเป็นโปรโตคอล HTTP และ HTTP ขึ้นอยู่กับ TCP ซึ่งหมายความว่าเซิร์ฟเวอร์นี้ proxys การเชื่อมต่อ TCP กับรูปแบบเนื้อหา HTTP ที่ระบุ มันน่าเบื่อที่จะดำเนินการต่อไปดูรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
// ที่อยู่ต่อไปนี้คือที่อยู่ของพร็อกซีเซิร์ฟเวอร์
ซ็อกเก็ตซ็อกเก็ต = ซ็อกเก็ตใหม่ ("10.1.2.188", 80);
// เนื้อหาที่เขียนและเขียนเป็นเนื้อหาที่เป็นไปตามรูปแบบโปรโตคอลคำขอ HTTP ขอ baidu
socket.getOutputStream () เขียน (สตริงใหม่ ("รับ http://www.baidu.com/ http/1.1/r/n/r/n"). getBytes ());
ไบต์ [] bs = ไบต์ใหม่ [1024];
inputstream คือ = socket.getInputStream ();
int i;
ในขณะที่ ((i = is.read (bs))> 0) {
System.out.println (สตริงใหม่ (bs, 0, i));
-
is.close ();
แน่นอนว่าใน Java มีพร็อกซีพร็อกซีท่องอินเทอร์เน็ตในเวลานี้โดยใช้ URL (HTTP) ไม่เกี่ยวข้องกับซ็อกเก็ต (TCP)
การคัดลอกรหัสมีดังนี้:
// ตั้งค่าพร็อกซี
System.SetProperty ("http.proxyset", "true");
System.SetProperty ("http.proxyhost", "10.1.2.188");
System.SetProperty ("http.proxyport", "80");
// เข้าถึงที่อยู่ปลายทางโดยตรง
url url = url ใหม่ ("http://www.baidu.com");
urlConnection con = url.openconnection ();
InputStreamReader ISR = ใหม่ inputStreamReader (con.getInputStream ());
ถ่าน [] CS = ถ่านใหม่ [1024];
int i = 0;
ในขณะที่ ((i = isr.read (cs))> 0) {
System.out.println (สตริงใหม่ (cs, 0, i));
-
isr.close ();
สุดท้ายมาสรุปกันเถอะ:
ในสภาพแวดล้อมโดยใช้พร็อกซี HTTP
หากคุณใช้ซ็อกเก็ต (TCP) เพื่อเชื่อมต่อกับเครือข่ายภายนอกคุณจะเชื่อมต่อโดยตรงกับพร็อกซีเซิร์ฟเวอร์จากนั้นระบุ URL เครือข่ายภายนอกเพื่อส่งต่อในคำขอ HTTP ที่ส่ง
หากคุณใช้ URL (HTTP) เพื่อเชื่อมต่อกับเครือข่ายภายนอกคุณจะต้องตั้งค่าพารามิเตอร์ HTTP Proxy หรือใช้พร็อกซี
ตกลงคุณสามารถใช้งานได้ตามที่คุณต้องการหลังจากที่คุณเข้าใจ
การคัดลอกรหัสมีดังนี้:
Socketchannel SC = Socketchannel.Open (ใหม่ inetSocketAddress ("10.1.2.188", 80));
sc.write (charset.forname ("UTF8"). ENCODE ("รับ http://www.baidu.com/ http/1.1/r/n/r/n"));
bytebuffer buffer = bytebuffer.allocate (1024);
ในขณะที่ (sc.read (บัฟเฟอร์)! = -1) {
buffer.flip ();
System.out.println (charset.forname ("UTF8"). decode (บัฟเฟอร์));
buffer.clear ();
-
sc.close ();
ตัวอย่างการเพิ่มพร็อกซีลงในการเขียนโปรแกรมซ็อกเก็ต Java
บางครั้งเครือข่ายของเราไม่สามารถเชื่อมต่อกับเครือข่ายภายนอกได้โดยตรง คุณสมบัติในการทำให้การตั้งค่าพร็อกซีเสร็จสมบูรณ์วิธีนี้ค่อนข้างง่าย แต่ไม่สามารถตั้งค่าพร็อกซีสำหรับการเชื่อมต่อแยกต่างหาก:
การคัดลอกรหัสมีดังนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
คุณสมบัติ prop = system.getProperties ();
// ตั้งค่าที่อยู่ของพร็อกซีเซิร์ฟเวอร์ที่จะใช้เมื่อเข้าถึง HTTP
prop.setProperty ("http.proxyhost", "192.168.0.254");
// ตั้งค่าพอร์ตการเข้าถึง HTTP ไปยังพร็อกซีเซิร์ฟเวอร์เพื่อใช้
prop.setProperty ("http.proxyport", "8080");
// ตั้งค่าโฮสต์ที่ไม่จำเป็นต้องเข้าถึงผ่านพร็อกซีเซิร์ฟเวอร์
prop.setProperty ("http.nonproxyhosts", "localhost | 192.168.0.*");
// ตั้งค่าที่อยู่พร็อกซีเซิร์ฟเวอร์และพอร์ตเพื่อการเข้าถึงที่ปลอดภัย
// มันไม่มีคุณสมบัติ https.nonproxyhosts มันสามารถเข้าถึงได้ตามกฎที่ตั้งไว้ใน http.nonproxyhosts
prop.setProperty ("https.proxyhost", "192.168.0.254");
prop.setProperty ("https.proxyport", "443");
// โฮสต์พอร์ตที่ใช้เซิร์ฟเวอร์พร็อกซี FTP และโฮสต์ที่ไม่ต้องการเซิร์ฟเวอร์พร็อกซี FTP
prop.setProperty ("ftp.proxyhost", "192.168.0.254");
prop.setProperty ("ftp.proxyport", "2121");
prop.setProperty ("ftp.nonproxyhosts", "localhost | 192.168.0.*");
// ที่อยู่และพอร์ตของพร็อกซีเซิร์ฟเวอร์ถุงเท้า
Prop.SetProperty ("Socksproxyhost", "192.168.0.254");
prop.setProperty ("Socksproxyport", "8000");
// ตั้งค่าชื่อผู้ใช้และรหัสผ่านเพื่อเข้าสู่ระบบพร็อกซีเซิร์ฟเวอร์
Authenticator.setDefault (ใหม่ myauthenticator ("ชื่อผู้ใช้", "รหัสผ่าน"));
-
myauthenticator คลาสคงที่ขยาย Authenticator {
ผู้ใช้สตริงส่วนตัว = "";
รหัสผ่านสตริงส่วนตัว = "";
myauthenticator สาธารณะ (ผู้ใช้สตริง, รหัสผ่านสตริง) {
this.user = ผู้ใช้;
this.password = รหัสผ่าน;
-
รหัสผ่านที่ได้รับการป้องกันการกำหนดค่า getPasswordauthentication () {
returnNew PasswordAuthentication (ผู้ใช้, password.toCharArray ());
-
-
วิธีที่ 2 ใช้พร็อกซีเพื่อใช้งานพร็อกซีสำหรับการเชื่อมต่อแต่ละครั้ง ลำบากในการตั้งค่า:
การคัดลอกรหัสมีดังนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
พยายาม {
url url = url ใหม่ ("http://www.baidu.com");
// สร้างพร็อกซีเซิร์ฟเวอร์
InetSocketAddress addr = ใหม่ inetSocketAddress ("192.168.0.254"
8080);
// พร็อกซีพร็อกซี = พร็อกซีใหม่ (proxy.type.socks, addr);
พร็อกซีพร็อกซี = พร็อกซีใหม่ (proxy.type.http, addr);
// ถ้าเรารู้ชื่อของพร็อกซีเซิร์ฟเวอร์เราสามารถใช้ได้โดยตรง
// เสร็จ
urlConnection conn = url.openconnection (พร็อกซี);
inputStream ใน = conn.getInputStream ();
// inputstream ใน = url.openstream ();
สตริง s = ioutils.toString (ใน);
System.out.println (s);
} catch (Exception e) {
E.PrintStackTrace ();
-
-