• Sonuç bulunamadı

Web sunucu ve sistem yönetim mimarisi

Web sunucu, taray dan gelen her iste i yeni bir iplik içinde kar lar. Böylece ayn anda farkl taray lardan gelen farkl istekler de kar lanabilir. Web sunucu, HTTP protokolü standartlar na göre çal r ve HTTP GET ve HTTP POST metodlar destekler.

Web sunucu, “WebServer” s içinde tan mlanm r ve sürekli bir döngü içinde ayarlanabilen bir TCP port’u dinler. Bu porta bir HTTP iste i geldi i anda ise, yeni bir iplik yaratarak iste i yeni yarat lan bu iplik içinde kar lar ve dinlemeye devam eder. Her iste in ele al nd bu iplik ise “WebServerConnection” s içinde tanmlanm r.

11.1 Web Sunucu S (WebServer)

Web sunucu, gelen her HTTP iste ini yeni bir iplik içinde kar lar. Ayr ca sisteme yetkili kullan olarak ba lanan her kullan n oturumunu ayarlanabilir bir süre boyunca saklar. Bu süre boyunca sisteme ba lanm kullan dan herhangi bir istek gelmez ise oturum zaman a na u rar ve kullan n yeniden kullan ad ve

ifresi istenir. “WebServer” s a daki ekilde tan mlanm r.

public class WebServer {

static final String mServerName = "Mobile Agent Server/1.0"; String mRoot;//Web sunucu varsay lan dizin ismi

String mDefaultFile; //varsay lan ana sayfa char mPathSeparatorChar;

Hashtable mMimeTypes; //istemciye gönderilecek dosya türleri boolean mStop = false;

Hashtable sessionIDTable = new Hashtable(); long sessionTimeout; //oturum zaman a

... }

WebServer s ndan bir nesne yarat ld ktan sonra “run” isimli metodu ça larak sunucunun gelen istekleri dinlemesine ba lan r. Ancak bundan önce istemciye gönderilecek dosya türleri belirlenir. Bir taray sunucunun gönderdi i verileri al rken ne türden bir veri almakta oldu unu bilmelidir. Örne in gönderilen veri text türünden bir veri olabilir, ya da bir resim dosyas , ya da bunlardan farkl olarak bir ikili dosya (binary file) olabilir. Sunucu istemciye veri göndermeye ba lamadan HTTP ba nda gönderece i verinin türünü ve uzunlu unu (Mime type) belirtmek zorundad r. Bu i leyi ekli asl nda tamamen HTTP protokolünün çal ma ekli ile ilgilidir.

Web sunucu s n “run” metodu a daki ekilde tan mlanm r.

private void run(int port, String root, String defaultFile) { ServerSocket socket = null;

try {

mMimeTypes = new Hashtable();

mMimeTypes.put(new String(".zip"), new String("application/zip")); mMimeTypes.put(new String(".gif"), new String("image/gif"));

mMimeTypes.put(new String(".jpg"), new String("image/jpeg")); mMimeTypes.put(new String(".jpeg"), new String("image/jpeg")); mMimeTypes.put(new String(".png"), new String("image/png")); mMimeTypes.put(new String(".htm"), new String("text/html")); mMimeTypes.put(new String(".html"), new String("text/html")); mMimeTypes.put(new String(".text"), new String("text/plain")); mMimeTypes.put(new String(".xml"), new String("text/plain")); mMimeTypes.put(new String(".txt"), new String("text/plain")); mMimeTypes.put(new String(".css"), new String("text/plain")); mMimeTypes.put(new String(".java"), new String("text/plain")); mMimeTypes.put(new String(".class"),new

String("application/octet-stream")); mMimeTypes.put(new String(".jar"), new

String("application/octet-stream")); mMimeTypes.put(new String(".js"), new String("text/html"));

mRoot = root;

mDefaultFile = defaultFile; socket = new ServerSocket(port);

mPathSeparatorChar = File.separatorChar;

System.out.println("Agent Server Web Daemon is running"); } catch (Exception e) { System.out.println("WebServer.run/init: " + e); return; } try { while (!mStop) { Socket s = socket.accept();

WebServerConnection c = new WebServerConnection(s, this); c.start(); } } catch (IOException e) { System.out.println("WebServer.run/loop: " + e.getMessage()); } }

Görüldü ü gibi, dosya türleri belirlendikten sonra belirlenen sunucu portundan dinleme moduna geçilmekte, sonra istek geldi inde yeni bir “WebServerConnection” nesnesi yarat larak bundan sonraki i lemler ona aktar p, dinlemeye devam edilmektedir.

“WebServerConnection” nesnesi içinde gelen istek ayr r ve gerekli olan lemler yap r. E er bu bir kullan n sisteme yetkili olarak ba lanma iste i ise ve gerekli kullan ad ve ifresi verilmi ise kullan için yeni bir oturum aç r ve oturum için verilen tekil kimlik bilgisi saklan r. Oturum kimlik bilgisi HTTP ba ile ta nan bir bilgidir; böylece kullan dan daha sonra gelen istekler için kullan ad ve ifresi istenmez. Oturum kimlik bilgilerini saklayan ve zaman dolan oturumlar silen gerekli metodlar da yine “WebServer” s içinde tan mlanm r.

Her oturumun ne zaman ba lad bilgisi ayr ca saklan r. Oturumlar n zaman a kontrol eden metod, belirli sürelerle sakl olan oturumlar tarar ve zaman a na

ram olan oturumlar siler. Yetkili bir kullan ile ba lant kurmu bir oturuma ait yeni bir istek geldi inde oturuma ait olan zaman s rlan r. Yani bir oturum için geçen zaman oturuma ait en son iste in yap ld andan o ana kadar geçen süredir.

HTTP ba lant na ait di er bütün görevler “WebServerConnection” nesnesi taraf ndan yerine getirilir. Bu s f, gelen isteklerin gerekiyorsa servlet arayüzü ile gerçekle tirilmesini de sa lamak üzere gerekli metodlar içermektedir.

11.2 Web Sunucu Ba lant S (WebServerConnection)

Web sunucu nesnesi, TCP soket üzerinden bir ba lant iste i ald anda yeni bir “WebServerConnection” nesnesi yarat r. Bu yeni web sunucu ba lant s n görevi, gelen istek yeni bir HTTP ba lant iste i ise, iste i ayr rmak ve yan istemciye dönmektir. Gelen istek statik bir nesneyi (örne in bir resim dosyas ) alma iste i de olabilir, dinamik ç kt üretmesi gerken (örne in bir servlet) bir istek de olabilir. Farkl istek türleri veya metodlar na göre (GET, POST) istekler farkl

ekilde kar lan r.

Yeni bir web sunucu ba lant nesnesinin ilk yapmas gereken, taray ile kurulan soket nesnesi üzerinden gelen bütün veriyi okumakt r. Bu i lemi “run” isimli metodu içinde gerçekler.

public void run() {

try { this.setName("Web Server Connection Thread"); BufferedReader input = new BufferedReader(new

InputStreamReader(mSocket.getInputStream(), ENCODING)); String request, name = null;

int method = BAD_REQUEST; int len = -1;

String serverVariableName = null; String serverVariableValue = null; while (true) { request = input.readLine(); if (request == null) { break; } ... }

Görüldü ü gibi taray n gönderdi i veri sat r sat r okunur. Bu istek HTTP standartlar na göre gelen bir istektir ve bir örne i u ekildedir.

GET /test.html HTTP/1.0 Host: www.test.com

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

Accept: */*

Accept-Encoding: gzip, deflate Accept-Language: tr

Connection: Keep-Alive

HTTP protokolü ayr nt lar na de inilmeyecektir ancak genel olarak yukar daki gibi bir istek yollayan bir taray ilk sat rda istedi i dosyay (test.html), izleyen sat rlarda da kendisiyle ilgili baz bilgileri yollar. Burada önemli olan sunucunun kendisine ne türden bir istek geldi ini (GET ya da POST) ve neyin istendi ini ayr lmas r.

Taray n gönderdi i “De ken_ smi: De ken De eri” eklindeki veriler de saklan r. Çünkü sunucu, bu de erlere uygun olarak, istemci taray n gerektirdi i farkl i lemler yürütmesi gerekebilir. Örne in, istemci s rmay destekleyen bir taray ya sahipse, sunucu da gönderece i veriyi s rarak yollayabilir.