Makalemizin ilk bölümünde ifade edildiği üzere Mobil
Cihazlar üzerinde Socket uygulamaları geliştirebilmeyi telaffuz etmek bundan
yaklaşık 3-4 yıl öncesine kadar çok nadir görülebilirdi. Günümüzde ütopik ; en
azından çok yüksek programlama bilgisi gerektirebilecek birçok kavramı .Net
Framework ; akabinde mobil cihazlar üzerinde .Net Compact Framework ile çok
anlaşılır ve basit bir seviyede masaüst ve mobil cihaz uygulama geliştiriciler
gerçekleştirebilmektedirler.
Konuya bu açıdan bakıldığında .Net Framework ve .Net Compact
Framework’ ün ; özellikle makalemizin asıl konusu gereği mobil cihazlar
üzerinde .Net Compact Framework’ ün 2.0 sürümünden itibaren ne kadar başarılı
ve güçlü olduğunu makalemizin ilk kısmında birçok noktadan değinerek ifade
etmiştik.
Bu makalemizde ise teorik bilgilerin yanısıra ; ilk
makalemizde hedeflenen senaryonun ; bir mobil cihaz chat uygulamasının ikinci
bölümüne ; mobil cihaz uygulamasını ayrıntılı bir şekilde anlaşılır ekran
görüntüleri ile geliştirmeye çalışacağız. Hatırlanabileceği üzere ilk bölümde
masaüstü bilgisayarımız üzerinde 15423 numaralı TCP Portu üzerinden “Asenkron
Mimari” ile süslenmiş bir sunucu uygulaması geliştirmiştik. Bu noktada ifade
etmemiz gerekebilirki geliştirmiş olduğumuz sunucu sadece mobil cihazlar ile
çalışacak şekilde tasarlanmamıştır. Standart bir masaüstü socket uygulaması
üzerinden bağlantı kurabilecek şekilde ; konuşabilecek şekilde tasarlanmıştır.
Cümlenin son kısmına dikkat edilecek olursa uygulamanın
tasarım aşamasında mobil cihazların bağlanabileceği yapıda özelleştirilmiş
herhangi bir çabanın sarfedilmediğinden bahsedilmektedir. Bu cümleden de
çıkarılabileceği üzere makalemizin ilk bölümünde ifade edildiği şekilde, Socket
uygulamaları geliştirilmesi ile ilgili kavramların neredeyse hepsinin masaüstü
socket uygulamaları ile birebir aynı olduğu rahatlıkla anlaşılabilir.
Bu noktadan itibaren hiç vakit kaybetmeden ilk bölümde
geliştirmiş olduğumuz masaüstü sunucumuz ile haberleşebilecek ve aynı zaman
sürecinde mesajlaşabilecek bir Mobil Cihaz Chat uygulaması geliştirelim.
İlk adımda diğer tüm makalelerimizde olduğu üzere standart
bir C# Smart Device Application projesi açarak işe başlıyoruz.

Bir sonraki adımda şekilde arayüzü tasarlıyoruz. Amaç
girilen ip adres / port kombinasyonu üzerinden geliştirmiş olduğumuz sunucu
uygulamasına “dünyanın herhangi bir noktasından” iletişim kurabilecek ve
“asenkron mimari üzerinden” mesajlaşabilecek bir mobil cihaz uygulaması
geliştirmektir.

Şekilden de anlaşılabileceği üzere form üzerine basit ve
temel Mobil Cihaz Windows form kontrolleri yerleştirerek uygulama arayüzünü
tasarlamış oluyoruz. Form üzerine “sunucu ile kurulacak olan başarılı bağlantı
sonucunda” mesajları girebileceğimiz bir metin kutusu ; mesaj gönderdiğimiz
süreçte ekran üzerinde görünecek olan isim bilgimizi girebileceğimiz bir metin
kutusu ; sunucu adresi ve port değerini girebileciğimiz bir metin kutusu ;
gelen / gönderilen mesajların listeleneceği bir liste kutusu ve son olarak
bağlantı kurma ile ilgili eylemi tetikleyecek olan bir buton kontrolü
yerleştiriyoruz.
Ve sıra geldi kod blokları üzerinde çalışmaya.
Bu noktada dikkat edilecek unsur Mobil Cihaz üzerinde
çalışacak olan uygulamamız adına geliştirecek olduğumuz kodların makalemizin
ilk bölümünde geliştirmiş olduğumuz masaüstü sunucu uygulamasını geliştirirken
yazdığımız kodlar ile neredeyse birebir aynı olduğudur. Sunucu uygulamasında
geliştirildiği üzere bu noktadada gerekli nesnelerin tanımlamaları yapılacak,
socket ayarları belirlenecek, ilgili referanslar verildikten sonra uygulamamız
sunucu uygulamamız ile haberleşip mesajlaşmaya başlayacaktır. Hiç vakit
kaybetmeden uygulama kodlarını geliştirmeye devam edelim. Bir önceki
uygulamamızda olduğu gibi ilk noktada uygulama içerisinde kullanacak olduğumuz
nesne referanslarını tanımlayalım.

Şekil üzerindende anlaşılabileceği üzere uygulama içerisinde
tanımlı olan nesnelerin referanslarını global tanım alanında tanımlamış olduk.
Bu noktada DefaultDelege isimli delegenin ayrıntılı işlevinden bir önceki
makalede bahsetmiştik.
Sıra geldi asenkron mimari üzerinden çağırılan metotların
işlerini tamamladığında gelip haber verecekleri CallBack metotlarını
tanımlamaya. Uygulama içerisinde tasarım ve önem bakımından CallBack
metotlarının yerinin başka olduğunu yine bir önceki makalemizde ifade etmiştik.
Gelen mesajın işlenmesi, yeni mesajların beklemeye
başlatılması v.s. gibi birçok önemli unsur CallBack metotları olarak ifade
ettiğimiz bu metotlar içerisinde gerçekleştirilmektedirler.

Ve ilk CallBack metodumuz. Sunucu uygulaması ile bağlantı
kurulduğu süreçte yakalanacak olan bu metot içerisinde socket’ imiz asenkron
olarak “mesaj bekleme” durumuna geçirilmektedir. Mesaj geldiğinde ise
MessageDelegate delegesinin adreslediği metot çalıştırılmaktadır. Hiç vakit
kaybetmeden bu delegenin adreslediği CallBack metodunu yazalım.

Bu metot içerisinde ise mesaj geldiğinde içi dolu olan
byte[] dizimizin (MessageBuffer) içerisinde barındırdığı mesajı liste kutusu
içerisine ekliyoruz. Fakat bu noktada dikkat edilmesi gereken en önemli unsur
bu ekleme işleminin worker thread içerisinden değilde primary thread içerisinde
gerçekleştirildiğidir. Bu amaca uygun olarak lstMESSAGES isimli liste kutumuzun
Invoke metoduna ekleme işleminin gerçekleştirileceği metodun adresini
barındıran dlg isimli delegemizi gönderiyoruz.
Son olarak dlg isimli delegenin adreslediği “mesaj ekleme”
ile ilgili metodumuzu tanımlıyoruz.

Gerçekleştirilen tek eylem gelen byte[] dizisini türkçe
karakter setine uygun olarak metne dönüştürüp liste kutusu içerisine eklemektir.
Sıra geldi uygulamanın yaşam süreci başlatıldığında
gerçekleştirilecek olan standart eylemleri tasarlamaya. Sunucu uygulamamız
üzerinde hazırladığımız yapının neredeyse birebir aynısını mobil cihazımız
üzerinde tasarlıyoruz. Uygulama ekranı açıldığında standart olarak bir socket
tanımlanacak, 54123 numaralı port ile bind edilecek ve gerekli istek geldiğinde
bağlantı kurulacaktır. Değinilmesi gereken bir önemli nokta daha ise uygulama
ekranı açıldığında bir önceki bölümde tanımlanan delegelerin adresleri
belirlenecektir. Şekildeki kod bloğu üzerinden devam ediyoruz.

Kod bloğu dikkatli incelendiğinde bir önceki sunucu
uygulaması içerisinde tasarlanan yapı ile neredeyse birebir aynı olduğu kolayca
farkedilebilmektedir. Ne kadar ilginç...
Bu noktada gerçekleştirilen başka bir yapı ise delegelerin
tanımlanması ve gerekli metot adreslerinin belirlenmesidir. Hiç vakit
kaybetmeden kaldığımız noktadan devam ediyoruz.
Sırada uygulama ekranı üzerine yerleştirilmiş button
kontrollerine tıklandığı zaman gerçekleştirilecek eylemlere. İlk durağımız
Connect button’ u.
Connect button’ una tıklatıldığında uygulama ekranı
yüklendiğinde tanımlanan socket objesi üzerinden “asenkron mimari” yardımıyla
sunucu üzerine bağlantı kurulmak istenmektedir. Bu noktada sunucu adresi “ : “
operatörü üzerinden iki parçaya ayrılmakta ; ilk parça IP Adresini ikinci parça
ise port bilgisini ifade etmektedir.
Bağlantı kurulma sürecinde uygulama ekranı üzerinde herhangi
bir kilitlenme yaşanmamakta ; Socket.BeginConnect metodu üzerinden dönen IAsyncResult
yardımı ile bağlantı kurulup kurulmadığı sürekli kontrol edilmekte ;
kurulmadığı süre zarfında Application.DoEvents() metodu üzerinden uygulama
ekranı serbest olarak çalıştırılmaktadır.
Başarılı bir bağlantı kurulabildiği taktirde uygulama ekranı
üzerinde bulunan kontrollerin erişilebilirliği değişmekte ; mesaj paneli aktif
hale gelmektedir.
Şekildeki kod bloğu üzerinden uygulama tasarımına devam
ediyoruz.

Sıra geldi mesajı gönderecek olan kod bloğunu tasarlamaya.
Gerçekleştirilecek olan tek eylem başarılı bir bağlantı sonucunda aktif hale
gelen socket objemiz yardımı ile girilen metin mesajını byte[] dizisine çevirip
karşı sunucuya göndermek olacaktır.

İşte bu kadar ! Kod bloklarına dikkat edilecek olursa yapı
sunucu uygulaması ile neredeyse birebir aynı olarak ifade edilebilir ! Yaşasın
.Net Compact Framework 2.0 ! :)
Hiç vakit kaybetmeden uygulamamızı test ediyoruz. Bu noktada
dikkat edilecek unsur senaryo gereği ilk olarak sunucu uygulamamızı
çalıştıracak olup ilgili sunucuya “aynı blok değerleri üzerinden” IP Adresi
alabilmiş bir fiziksel cihaz ya da mobil cihaz emülatörü yardımıyla bağlantı
kuracağız. Sunucu uygulamasını çalıştırıp Sunucuyu başlatıyoruz.

Start Server button’ una tıkladığımızda işletim sistemimiz uygulamamızın
bir portu dinlemeye çalıştığını ve bunun engellenip engellenmeyeceğini
soracaktır. Unblock seçeneğini seçerek sunucumuzu dinleme moduna geçiriyoruz.

Sıra geldi mobil cihaz uygulamasını sunucuya bağlanabilecek
şekilde yapılandırmaya. Örnek olarak çalıştırılan sunucunun IP Adresi
10.5.10.37, port değeri ise 15423’ tür. Bu değerleri kullanarak mobil cihazımız
üzerinde gerekli bağlantı işlemlerini gerçekleştiriyoruz.

Connect’ e tıklıyoruz :

Ve bağlantı kuruldu ! Mesajlaşmaya başlıyoruz :

Sonuç mükemmel ! Bir makalemizin daha sonuna geldik. Başka
bir makalede daha görüşmek üzere.