How web sever works (Implementation in Java)
Web Server တွေ ဘယ်လိုအလုပ်လုပ်သလဲဆိုတာကို ဒီမှာရှင်းပြီးပါပြီ
https://web.facebook.com/thet.khine.587/posts/10207213385452495
ခုက Simple Web Server တခုကို Java နဲ.ဘယ်လိုရေးမလဲဆိုတာပေါ့။ Java က ပေါ်ကတည်းက PHP, Perl တို.လို Web အတွက်ထုတ်ထားတဲ့ language မဟုတ်ဘူး။ ဆိုချင်တာက မူလ Java language သည် server ပေါ်မှာ web အတွက်အလုပ်မလုပ်နိုင်ဘူး။ Web အတွက်အလုပ်လုပ်နိုင်အောင် JavaEE ထုတ်လိုက်တာ။ Java ကို Web အတွက် အလုပ်လုပ်နိုင်ဖို. Servlet Container ဥပမာ Tomcat လိုကောင်တွေလိုတယ်။
Tomcat ဆိုတာကလဲ အကြမ်းဖြင့်အားဖြင့် Servlet container လို.ခေါ်တယ်။ Servlet ဆိုတာ တခြား Java ကို server side မှာ run လို.ရအောင် လုပ်ပေးထားတာပဲ၊ PHP script file တွေနဲ.သဘောတရားချင်းသွားဆင်မယ်။ အဲ့တော့ Servlet ကို run လို.ရအောင် servlet container လိုတယ် ။ Servlet container ဆိုတာ တကယ်တမ်းက HTTP server ကို Java နဲ.ရေးထားတာ။ နောက်ဘာတွေထပ်ပါလာသလဲဆိုတော့ Servlet API ကို implement လုပ်ထားတဲ့ class တွေ library တွေပါလာတယ် ။ အဲ့ဒီ abstraction ကိုငုံပြီး Spring, Struct လို Framework တွေ ဆောက်ထားတာ။
အဲ့တော့ JavaEE ကို barebone နားလည်ဖို.ဆိုရင် Java နဲ. WebServer ဘယ်လိုဆောက်ရသလဲ နားလည်ဖို.လိုတယ် အဲ့ကနေတဆင့် Tomcat လို container တွေဘယ်လိုဆောက်ပြီး servlet လို abstraction တွေပေးသလဲ အဲ့ကနေ မှ တဆင့် Servlet သုံးပြီး Spring လို framework တွေဘယ်လိုဆောက်သလဲနားလည်မှာ။
Web Server ရဲ.အဓိကအလုပ်က Server Socket ကြီး ဖွင့်ပြီး while(true) နဲ. (server ဆိုတော့အမြဲ listen လုပ်နေရမှာ) client တွေလာ connect လုပ်မှာကိုစောင့်နေတယ်၊ ဒီနေရာမှာ ServerSocket ဆိုတာ JavaSE API မှာပါတဲ့ TCP Server Socket ကို ဆောက်နိုင်တဲ့ class ပဲဖြစ်တယ်။ Socket Programming ကို ဒီနေရာမှာ အကျယ်မချဲ.တော့ဘူး။ ServerSocket က listen လုပ်နေတာသည်ဘာနဲ.တူသလဲဆိုတော့ call center တခုနဲ.တူတယ် call center hot line နံပါတ်တခုနဲ. အမြဲနားထောင်နေတယ်။ TCP မှာကျတော့ port ပေါ့. Web Server တွေက default port 80 နဲ. listen လုပ်တယ်။ Client ကနေ Web Server listen လုပ်နေတဲ့ port ကို TCP လာချိတ်ပြီဆိုပါစို. (ဒါကို browser ကနေလုပ်မယ် ကိုက လုပ်စရာမလိုဘူး browser address bar မှာ http://localhost:9090 ရိုက်လိုက်ရင် TCP ချိတ်ပြီး http request ပို.မယ် ) Server သည် client socket လေးတခုသူ.လာချိတ်မယ်( Customer တယောက်က call center hotline ဆီဖုန်းဆက်သလိုပဲ ဖုန်းရတယ် ဒါဆို စကားပြောဖို. operator တယောက်နဲ.လွှဲပေးမယ် operator နဲ. line ရနေတာသည် TCP connection ချိတ်လို.ရနေတာနဲ.တူတယ်)
ဒါကို ဒီမှာရေးထားတယ်
https://github.com/…/simplejav…/SimpleJavaWebServer.java
serverSocket = new ServerSocket(9090); // Start, listen on port 80
while (true)
{
try
{
Socket s = serverSocket.accept(); // Wait for a client to connect
ClientProcessorThread thread = new ClientProcessorThread(s); // Handle the client in a separate thread
thread.start();
} catch (Exception x)
{
System.out.println(x);
}
}
Socket s = serverSocket.accept(); သည် client က connection ချိတ်ရင် ချိတ်မိတဲ့ TCP socket လေးရပြီ ဒီဘက်က server, ဟိုဘက်က browser လှမ်းပြောလို.ရပြီ.
Web server တခုသည် client connection ပေါင်းများစွာကို serve လုပ်နိုင်တယ်။ အဲ့တော့ Client အများကြီး serve လုပ်ုနိင်အောင် Thread တွေနဲ.ခွဲလုပ်လိုက်မယ်။ အောက်က code သုံးပြီးတော့.
ClientProcessorThread thread = new ClientProcessorThread(s); // Handle the client in a separate thread
thread.start();
ClientProcessorThread ကဘာလုပ်လဲဆိုရင် browser ကပို.တဲ http request ကိုဖတ်မယ် နောက် ဥပမာ http://localhost:9090/index.html လိbrowser ကရိုက်ရင် serverမှာ
GET /index.html HTTP/2.0
ဆိုပြီးရမယ် အဲ့မှာ http request ကိုဖတ်မယ် http method, url တွေကိုရအောင် parse မယ်.
အဲ့တာကို ဒီ class ရဲ. readHttpHeader methodမှာရေးထားတယ်။
https://github.com/…/simplej…/ClientProcessorThread.java
ဘာလိုချင်တာလဲသိရင် file system ကနေ လိုချင်တာကို ရှာ byte ပြောင်း http resonse format အနေနဲ. TCP Output stream ထဲကို ရိုက်ထုတ်ပေးလိုက်မယ်။ အဲ့တာကို run() မှာလုပ်တယ်။ response format ကိုသေချာလိုက်နာဖို.လိုတယ်၊ နောက် correct minetype ပြန်ပေးဖို.လဲလိုတယ်
Original Post=>(https://www.facebook.com/thet.khine.587/posts/pfbid09nm8sFrg5EYD1AiFATNLmpsqEaHp4XNLRsbpGT9zxD3qCNkeEysAEf2mLPRK7KRMl)