عند اختبار برمجة المقبس مرة أخرى اليوم ، لا يمكنني الاتصال بالشبكة الخارجية. تستخدم الشركة وكيل HTTP. لم أفهم البحث عبر الإنترنت ، لذلك قضيت الكثير من الوقت في الدراسة. فقط بعد رؤية العلاقة الجيدة بين بروتوكولات HTTP و TCP هل يمكنك فهمها. الآن بعد أن يمكنك استخدام وكيل HTTP من خلال المقبس ، تكون النتيجة بسيطة للغاية ، ولكن العملية صعبة للغاية.
1. دعنا نتحدث باختصار عن HTTP و TCP (يمكنك Google المحتوى المحدد بنفسك ، والمعلومات كاملة للغاية).
HTTP: إنه بروتوكول طبقة التطبيق ، استنادًا إلى بروتوكول طبقة النقل.
TCP: إنه بروتوكول طبقة النقل ، استنادًا إلى بروتوكول طبقة الشبكة.
IP: إنه بروتوكول طبقة الشبكة.
يتطلب اتصال TCP ثلاثة مصافحة (تمامًا مثل نقل تسجيل الأسرة ، غير مفصل). تنسيق المحتوى. على سبيل المثال ، إذا قال شخص ما "SB" (اسمك) ، فأنت تجيب "نعم" ، فهو مجرد تنسيق المحتوى ، ولا يغير طريقة الإرسال للصوت (يتم نقلها من خلال موجات الصوت <متوسطة أجهزة الشبكة> ، من خلال اللغات أن كلا الطرفين يمكن أن يفهم. وبالمثل ، فإن FTP و Telnet هما بروتوكول طبقة التطبيق.
2. بعد إدراك ما سبق ، دعنا نتحدث عن وكيل HTTP. الخادم. تجدر الإشارة هنا أيضًا إلى أنه يحدد بروتوكول HTTP ، ويستند HTTP على TCP ، مما يعني أن هذا الخادم يحقق اتصال TCP بتنسيق محتوى HTTP المحدد. من الممل الاستمرار ، انظر إلى الكود التالي:
نسخة الكود كما يلي:
// العنوان التالي هو عنوان خادم الوكيل
Socket Socket = مقبس جديد ("10.1.2.188" ، 80) ؛
// المحتوى المكتوب والمكتوب هو المحتوى الذي يتبع تنسيق بروتوكول طلب HTTP ، طلب Baidu
Socket.getOutputStream (). الكتابة (سلسلة جديدة ("احصل على http://www.baidu.com/ http/1.1/r/n/r/n"). getBytes ()) ؛
Byte [] bs = new byte [1024] ؛
inputStream هو = socket.getInputStream () ؛
int أنا ؛
بينما ((i = is.read (bs))> 0) {
system.out.println (سلسلة جديدة (bs ، 0 ، i)) ؛
}
is.close () ؛
بالطبع ، في Java ، هناك وكيل للتصفح على الإنترنت.
نسخة الكود كما يلي:
// تعيين الوكيل
System.SetProperty ("http.proxyset" ، "true") ؛
System.SetProperty ("http.proxyhost" ، "10.1.2.188") ؛
System.SetProperty ("http.proxyport" ، "80") ؛
// الوصول مباشرة إلى عنوان الوجهة
url url = url new ("http://www.baidu.com") ؛
urlConnection con = url.openconnection () ؛
inputStreamReader ISR = جديد inputStreamReader (con.getInputStream ()) ؛
char [] cs = new Char [1024] ؛
int i = 0 ؛
بينما ((i = isr.read (cs))> 0) {
system.out.println (سلسلة جديدة (cs ، 0 ، i)) ؛
}
isr.close () ؛
أخيرًا ، دعونا نلخص:
في بيئة باستخدام وكيل HTTP ،
إذا كنت تستخدم Socket (TCP) للاتصال بالشبكة الخارجية ، فستتصل مباشرة بخادم الوكيل ثم تحديد عنوان URL للشبكة الخارجية لإعادة توجيهه في طلب HTTP المرسل.
إذا كنت تستخدم URL (HTTP) للاتصال بالشبكة الخارجية ، فأنت بحاجة إلى تعيين معلمات وكيل HTTP أو استخدام الوكيل.
حسنًا ، يمكنك استخدامه كما تريد بعد أن تفهم.
نسخة الكود كما يلي:
Socketchannel sc = socketchannel.open (new inetsocketaddress ("10.1.2.188" ، 80)) ؛
sc.write (charset.forname ("UTF8"). encode ("get http://www.baidu.com/ http/1.1/r/n/r/n")) ؛
Bytebuffer Buffer = bytebuffer.allocate (1024) ؛
بينما (sc.read (buffer)! = -1) {
buffer.flip () ؛
System.out.println (charset.forname ("utf8"). فك الشفرة (العازلة)) ؛
buffer.clear () ؛
}
Sc.Close () ؛
مثال على إضافة الوكيل إلى برمجة مقبس Java
في بعض الأحيان ، لا يمكن توصيل شبكتنا بالشبكة الخارجية. خصائص لإكمال إعداد الوكيل ، هذه الطريقة بسيطة نسبيًا ، ولكن لا يمكن إعداد وكيل لاتصال منفصل:
نسخة الكود كما يلي:
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
Properties 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") ؛
// قم بتعيين اسم المستخدم وكلمة المرور لتسجيل الدخول إلى خادم الوكيل
Australiticator.setDefault (myauthenticator جديد ("اسم المستخدم" ، "كلمة المرور")) ؛
}
فئة ثابتة myauthenticator يمتد المصادقة {
user user user = "" ؛
Private String Password = "" ؛
MyAuthentIcator العامة (مستخدم سلسلة ، كلمة مرور السلسلة) {
this.user = المستخدم ؛
this.password = كلمة المرور ؛
}
Passwordaustication GetPasswordauthentication () {
returnnew passwordauthentication (المستخدم ، password.tochararray ()) ؛
}
}
تستخدم الطريقة 2 الوكيل لتنفيذ الوكيل لكل اتصال. مزعج لضبط:
نسخة الكود كما يلي:
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
يحاول {
url url = url new ("http://www.baidu.com") ؛
// إنشاء خادم وكيل
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) ؛
// إذا عرفنا اسم خادم الوكيل ، فيمكننا استخدامه مباشرة
// ينهي
urlConnection conn = url.openconnection (الوكيل) ؛
inputStream في = conn.getInputStream () ؛
// inputStream in = url.openstream () ؛
سلسلة s = ioutils.toString (في) ؛
system.out.println (s) ؛
} catch (استثناء e) {
E.PrintStackTrace () ؛
}
}