ওয়েব সার্ভার কি? HTTP কি? এগুলো কিভাবে কাজ করে?
যখন আমরা একটা ওয়েব ব্রাউজার যেমন Chrome খুলে তার এড্রেস বারে একটা ওয়েবসাইটের এড্রেস যেমন http://example.com লিখি তখন আসলে আমরা ব্রাউজার কে বলি এই অ্যাড্রেসে যেই ওয়েব সার্ভার আছে তার সাথে যোগাযোগ করো। যেন চিঠি পাঠানোর মত। ব্রাউজার আমাদের চিঠি ওয়েব সার্ভার কাছে নিয়ে যাচ্ছে এবং ওয়েব সার্ভার সেই চিঠির উত্তরে যা বলবে তা আমাদের কাছে নিয়ে আসবে। ওয়েব সার্ভার মানে ধরে নিন একটি কম্পিউটার যেখানে সারাদিন একটা প্রোগ্রাম চলে। এই প্রোগ্রাম আমাদের চিঠির আশায় বসে থাকে এবং চিঠি পেলে তার উত্তর দেয়।
URL কি?
এড্রেসবারে আমরা যে এড্রেসটি লিখি তাকে URL বলে এই URL এই বলা থাকে আমাদের ব্রাউজার কার সাথে যোগাযোগ করব কিভাবে যোগাযোগ করবে এবং তাকে কি বলবে।
যোগাযোগের ভাষা হচ্ছে HTTP, Host আর Port হচ্ছে যোগাযোগের ঠিকানা। যেমন ধরেন কাউকে বললাম বাংলায় লেখা একটি চিঠি অমুক শহরে অমুক বাড়িতে পাঠান।
এখন ব্রাউজার এই URL এর ঠিকানা HTTP ভাষায় যোগাযোগ করবে এবং ওই ওয়েব সার্ভার আমাদের চিঠির যেই উত্তর দিবে আমাদের দেখাবে, যেমন আমরা ফেসবুকের বেলায় একটি সুন্দর HTML ওয়েবপেজ দেখতে পাবো।
যোগাযোগের ব্যাপারটা মোটেও এত সহজে হয় না। শুরুতে ব্রাউজার ওয়েব সার্ভার এর সাথে একটি TCP কানেকশন তৈরি করে। তারপরেই TCP কানেকশন দিয়ে HTTP Request পাঠায়। তারপর সার্ভারের উত্তরের জন্য অপেক্ষা করে এবং সার্ভারের উত্তর (HTTP Response) দিলে তা নিয়ে ফেরত আসে এবং আমাদের দেখায় কি উত্তর এলো।
এই সাহায্যে শুধুমাত্র ব্রাউজার এর সাথে কথা বলতে পারে তা না, এটি হতে পারে যে কোন কিছু যা HTTP ভাষায় (Protocol) কথা বলতে পারে। এদের Client বলে।
Python Socket দিয়ে ওয়েব সার্ভার লিখি
তাহলে এবার একটু পরীক্ষা করে দেখা যাক জিনিসটা কিভাবে কাজ করে।
Python Socket দিয়ে অতি সাধারণ ওয়েব সার্ভার লিখি (server.py)
1 | #!/usr/bin/env python3 |
কি লিখলাম?
শুরুতে বলে দিলাম হচ্ছে আমাদের ওয়েব সার্ভার HOST
এবং PORT
।
1 | HOST='127.0.0.1' |
এরপর TCP সকেট খুললাম, সকেটে কিছু অপশন সেট করলাম, Host এবং Port এ Bind করলাম এবং সকেট দিয়ে Listen করা শুরু করলাম।
1 | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: |
তারপর নতুন কানেকশন Accept করলাম, কানেকশন এ Client সাইড থেকে কি বলা হয়েছে তা Print দিলাম এবং উত্তরে “Hello world” পাঠিয়ে দিলাম, তা Print দিলাম।
1 | conn, addr = s.accept() |
যেকোনো টার্মিনালে প্রোগ্রামটি রান দিলাম
1 | python server.py |
এবার একটি ওয়েব ব্রাউজার খুলে এই http://127.0.0.1:8000/ অ্যাড্রেসে গেলে “Hello world” লেখাটা দেখতে পাবো
এভাবেই আমরা একটি HTTP সার্ভার লিখে ফেললাম.
HTTP Syntax
অন্য যেকোনো ভাষার মতো HTTP Protocol এর নিজস্ব সিনট্যাক্স রয়েছে। আমাদের code এ প্রিন্ট দেওয়া লাইন দুটো দেখলে এটা বোঝা যায়। চলো দেখি কি প্রিন্ট হয়েছে টার্মিনালে।
খেয়াল করলে দেখবে Client said
এই লাইনে সে কথাটি প্রিন্ট হয়েছে:
1 | Client said b'GET / HTTP/1.1\r\n...blah blah...' |
সব HTTP Request এভাবে লেখা লাগে:
- শুরুতে থাকে HTTP Method, এক্ষেত্রে GET কেননা আমরা সার্ভার থেকে উত্তর “পেতে” যাচ্ছি
- তারপর একটা স্পেস দিয়ে থাকে path (এই ক্ষেত্রে /)
- তারপর একটা স্পেস দিয়ে HTTP Version (1.1)
- তার পরের লাইনে HTTP Header। আমাদের বেলায় ব্রাউজার একগাদা হেডার পাঠিয়েছে
এবার দেখি আমাদের সার্ভার কি উত্তর দিয়েছিল:
1 | Server said b'HTTP/1.1 200 OK\r\n\nHello, World!' |
আবার সব HTTP Response এই ফরম্যাটে লেখা লাগে
- শুরুতেই থাকে HTTP Version
- তারপর একটা স্পেস দিয়ে Status Code
- তার পরের লাইনে HTTP Header যদি থাকে
- তারপর এক লাইন গ্যাপ দিয়ে Response Body। স্ট্যাটাস কোড আমাদের বুঝায় সার্ভার ঠিকঠাক উত্তর দিয়েছে কিনা। যেমন এক্ষেত্রে সার্ভার “ওকে”। সার্ভার যদি ঠিকঠাক উত্তর দিতে না পারে তাহলে অন্য স্ট্যাটাস রিটার্ন করতে পারে। আমাদের পরিচিত একটা স্ট্যাটাস হচ্ছে 500 Internel Server Error
আরো জানতে:
- URL: https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL
- HTTP Overview https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview
ওয়েব সার্ভার কি? HTTP কি? এগুলো কিভাবে কাজ করে?