أعتقد أنه لن يكون من المبالغة القول إن معرفة وفهم جوهر
بروتوكول HTTP أمر ضروري لأي شخص قرر المشاركة بجدية في أي من مجالات تطوير الويب الحديثة. تجربتي الشخصية تشير إلى أن الفهم لا يأتي على الفور. أشعر بالخجل من القول إن هناك أوقاتًا كانت فيها كلمات "GET and POST" أقرب إلى تعاويذ سحرية بالنسبة لي ، ولم أشك في وجود PUT و PATCH و DELETE.
قبل بضعة أشهر ، بالإضافة إلى التطوير نفسه ، بدأت أيضًا بالتدريس ، وطرحت أسئلة حول كيف أنه من الأسهل والأكثر وضوحًا أن أخبر مطوري جافا في المستقبل عن جوهر بروتوكول HTTP. بعد عدة أيام من الجلبة وسلسلة من المحاولات غير الناجحة لتقديم عرض تقديمي ، ظهرت الفكرة ، لماذا لا تكتب أبسط خادم HTTP في Java ، لأنه لا يشرح جوهر البروتوكول وكذلك تنفيذه العملي.
كما اتضح ، هذا ليس بالأمر الصعب على الإطلاق. أدناه هو الرمز الذي سيكون كافيا للتفاعل الصحيح مع أي متصفح! كل ما نحتاج إليه هو ServerSocket وبعض I / O القياسية.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) {
حاول تشغيل هذا الرمز. تجدر الإشارة إلى أن المنفذ الذي تم إنشاء ServerSocket يجب أن يكون مجانيًا. إذا كان المنفذ المحدد مشغولاً ، فيجب عليك إما تحريره أو استخدام منفذ مجاني آخر.
بعد تشغيل هذا الرمز ، انتقل إلى نافذة المتصفح واكتب في شريط العنوان
http://localhost:8080/
. إذا سارت الأمور على ما يرام ، فسوف نرى في نافذة المتصفح النص "مرحبًا بالجميع" ، وفي نص سجل الخادم مماثل للنص أدناه:
Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected!
في كل مرة ندخل فيها شيئًا في شريط العناوين في المتصفح ونضغط على Enter ، لن يحدث شيء آخر غير إرسال نص يبدأ بكلمة GET وينتهي بتغذية سطر. بعد كلمة GET ، تتبع المسافة المسار إلى المستند المطلوب على الخادم. حاول إدخال
http://localhost:8080/something
في المستعرض وشاهد كيف يتغير نص الطلب في السجل.
في سطور الاستعلام ، تبدأ من الثانية ما يسمى رؤوس من خلالها يتم نقل المعلومات حول إعدادات العميل إلى الخادم. كل سطر رأس له التنسيق
[ ] : []; []; ... []
[ ] : []; []; ... []
[ ] : []; []; ... []
.
بعد قراءة نص الطلب بالكامل من قبل الخادم ، نرسل إليه أبسط استجابة ، وهيكلها بسيطة جدًا وتشبه بنية الطلب. يحتوي السطر الأول على إصدار بروتوكول HTTP ورمز
OK 200 ، الذي سيخبر المتصفح أن الطلب قد تمت معالجته بنجاح (الكل يعرف رمز 404 بشكل أفضل ، أليس كذلك ؛)). يتبع ذلك عنوان واحد فقط
من نوع المحتوى يتم فيه إرسال معلومات حول تنسيق المستند المرسل (نص / html) وترميزه (charset = utf-8). بعد الرأس عبارة عن سطر تغذية (شرط إلزامي لبروتوكول HTTP) والنص الفعلي الذي سيتم عرضه في المستعرض.
هذا كل شئ! بالطبع ، هذا أبعد ما يكون عن كل ما تحتاج لمعرفته حول بروتوكول HTTP ومبادئ تطوير خوادم الويب ، لكنني لا أريد تعقيد هذا المثال ، لأن وتتمثل مهمته الرئيسية في إظهار أبسط الاتصالات عبر بروتوكول HTTP. في أحد مقالاتي التالية ، سأحاول تطوير موضوع دراسة بروتوكول HTTP من خلال تنفيذه.
محدث يمكن العثور على مثال أكثر تقدمًا لمثل هذا الخادم في
كيفية عمل Tomcat: دليل لتطوير حاوية سيرفيت جافا الخاصة بك بواسطة Paul Deck و Budi Kurniawan ، الفصل 1 -
خادم الويب البسيط .
UPD1. ندوة عبر الويب بناءً على هذه المقالة
www.youtube.com/watch؟v=RBUFdFKg_rI