Firefox'ta kapattığınız sekmeleri tekrar açmak için ctrl+shift+t tertibini kullanabilirsiniz.

Ana sayfa » .Net Remoting’e Bir Bakış

Etiketler: .Net/C# Remoting SingleCall Singleton
Kategoriler: .Net/C#

.Net Remoting dağıtılmış uygulamalar arasında iletişimi sağlayan bir sistemdir. Daha somut bir tanımlama ile; bir ağ üzerinde, bir istemci uygulamadan, uzaktaki bir kaynağa erişmenize (uzak uygulama alanındaki bir nesneye, nesnenin public öğelerine) olanak tanıyan bir yapıdır.

Veriler, iletişim kanalları sayesinde uygulamalar arasında taşınır. Remoting 2 tip ileişim kanalı kullanır. Tcp ve Http. Tercih edilen iletişim kanalına göre nesnelerin serileştirme modeli de değişir. Tcp kullanıldığında nesneler ikili (binary), Http kullanıldığında SOAP (xml) serileştirme modelleri uygulanır. Binary formatlama, SOAP a göre çok daha hızlı çalışır.

Remoting de, uzaktan erişilecek olan nesne System.MarshalByRefObject sınıfından türemelidir. Bu sınıf nesnenin uzaktan erişilebilmesini sağlayan temel yapıyı içerir. Bu sınıftan türeyen nesne, hem istemcinin, hem de nesneyi sunacak olan sunucunun (sunucu nesneden ayrı bir uygulama alanıdır) referansına eklenir. İstemci nesnenin sarmaladığı methodları sunucu üzerinde invoke eder.

İstemci, uzak methosu çağırdığında istek seçilen iletişim kanalına uygun formatlayıcı tarafından seri edilip sunucunun dinlediği kanala iletilir. Sunucu metodu çalıştırır ve sonucu istemciye geri iletir.

Remoting İşleyiş

Remoting iki tip uzak nesne kullanabilmemize olanak tanır. İstemci tarafından yönetilenler ve sunucu tarafından yönetilenler. İstemci tarafından yönetilen uzak nesnelerin, yaratılması ve yok edilmesi istemci tarafından kontrol edilir. Sunucu tarafından yönetilen uzak nesneler, istemci, nesnenin bir örneğini yarattığında değil (new operatörünün kullanıldığı anda değil), uzak methodu çağırdığında, sunucu tarafından yaratılır. Suncu tarafından yönetilen nesneler de iki farklı kipte sunulur. SingeCall kipi ve Singleton kipi. Suncuya sunduğu nesneyi hangi kipte sunacağı bildirilir. Buna göre SingleCall kipinde sunucu her bir istem için nesnenin yeni bir örneğini yaratır. Singleton kipinde ise sunucu her bir istemci için nesnenin sadece bir örneğini yaratır.

Örneğimiz ile bu iki kip arasındaki hayati farkı açıklayalım.

Uzak Nesnemiz.

using System;
using System.Collections.Generic;
using System.Text;

namespace UzakNesneler
{
    public class SiraMatik:MarshalByRefObject
    {
        int sira = 0;

        public int siraAl()
        {
            lock (this)
            {
                sira = sira + 1;
            }
            return sira;
        }
    }
}

Yazıda da belirtildiği üzere nesnemiz MarshalByRefObject sınıfından türemektedir. Bu da onu uzak bir nesne yapmak için yeterlidir. siraAl() metodu sıra numarasını bir artırarak sonucu bize döndürmektedir.

Sunucu ayar dosyamız (server.config)



  
    
      
        
        
      
      
        
      
    
  

Sunucu uygulamamıza, Siramatik uzak nesnesini nasıl sunacağını bu ayar xml dosyası ile bildireceğiz. Tabi bu ayarlamaları kodlama ile de yapmak mümkündür.

Sunucu Uygulaması

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Collections;

namespace RemotingSunucu
{
    class Program
    {
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("server.config");
            Console.WriteLine("Sunucuyu durdurmak için bir tuşa basınız");
            Console.ReadLine();
        }
    }
}

İstemci Uygulaması
Ayar dosyası



  
    
      
        
      
      
        
        
      
    
  

Uygulama

  SiraMatik siraMatik;
        private void Form1_Load(object sender, EventArgs e)
        {
            RemotingConfiguration.Configure("Client.config");
            siraMatik = new SiraMatik();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = siraMatik.siraAl().ToString();
        }

Hem sunucu hem de istemci uygulamamızın referanslarına uzak nesnemizi ekledik. Sunucu uygulamamıza bir ayar dosyası yarıdımı ile uzak nesnemizi nasıl sunacağını belirttik. Önce sunucu uygulamamızı daha sonra da istemci uygulamamızı çalıştırıp , istemci uygulamamızdaki sıra al düğmesine tıkladığımızda, method istemcide değil uzak uygulamada çalışır. Sıra numarası bir artar ve sonuç istemciye geri bildirilir. Düğmeye bastıkça sıranın bir arttığını görebilirsiniz. Dahası istemci uygulamadan bir örnek daha çalıştırıp düğmeye basarsanız sıranın kaldığı yerden devam ettiğini görebilirsiniz. Bunu sağlayan singleton kipidir. Şayet sunucu ayar dosyasına kipi SingleCall olarak belirtmiş olsaydık, istemcilerde (aynı istemcide bile) düğmeye bastıkça sayının artmadığını görebilirdik. Çünkü daha önce de belirttiğim gibi SingleCall kipinde her bir istek için (istemci için değil) nesnenin yeni bir örneği yaratılır.

Çözümü buradan indirebilirsiniz

« .Net Bellek Yönetimi 2: Bileşenler, Diziler ve COM
Windows Mobile ile merhaba dünya yeniden! »

Alakalı (olabilecek) yazılar

Alakasız (yüksek ihtimal) yazılar




Sen de yorum yazabilirsin!