Makale Özeti

Bu makalemizde ilk bölümde hazırlamış olduğumuz Windows Masaüstü Chat sunucumuz ile .Net Compact Framework 2.0 TCP Socket’ ler üzerinden iletişim kurabilecek olan bir Mobil Cihaz Uygulaması geliştireceğiz.

Makale

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.


Ekin ÖZÇİÇEKÇİLER
Microsoft Certified Trainer
ekin.ozcicekciler@bilgeadam.com
MCP, MCAD.NET, MCSD.NET, MCSD.NET, MCTS, MCPD Ent.