Jump to content

.net Remoting - Bölüm 1


wmismail

Recommended Posts

Merhabalar, 3 bölümden oluşmuş .Net Remoting yazımızın ilk bölümünde .Net Remoting teknolojisini tanıyacağız. 2. Bölümde bir uygulama yazacağız bu uygulama Windows Form üstünden veriye erişmekle alakalı. 3. bölümde ise yine bir uygulama yazacağız ancak bu sefer istemci programımız Web Form olacak.

İlk bölüme başlayalım.

Remoting, Microsoft .Net mimarisinde dağıtık uygulamalar (distrubuted application) geliştirmek için çıkarttığı bir teknolojidir. Amacı çok katmanlı uygulamalar (n tier) oluşturup programların daha efektif ve güçlü çalışmasını sağlamaktır.

Her .Net programının içindeki işlem (metotlar gibi) kendi uygulama etki alanı (application domain) nında çalışır. Application Domainler sizin işlemlerinizi sarar. Bunun denetimini ve düzenlenmesini CLR (Common Langugage Runtime) ayarlar. Her işlem kendi domaininde çalıştığı için bir işlemin oluşturduğu bir hata diğer işlemleri etkilemez. Application Domainler bir çeşit izole etme yapısıdır. Ancak günümüzde bir çok program veriyi bir mantıkla başka bir programa yani kısacası iki farklı Application domain i arasında bir transfere ihtiyaç duyarlar. Bir işlemi sarmalamış Application Domainin içindeki bir nesneyi ele alalım. Bu nesnenin başka bir Application Domaine aktarılmasını sağlayan yöntemlerin en güzeli Remoting dir.

Remotin .Net mimarisinde olduğu için oldukça esnek bir yapıya sahiptir. Ancak Remoting in temeli metot paylaşmaya dayanmaktadır. Remoting işleminde nesneler direk olarak çağırılmazlar. Temel olarak metotları çağarılır. Biz çağardığımızda metotlar çağırılan nesnelerde işlenirler. Metotların Access modifier ları (erişim düzenleyici) bu metotların uzaktan çağarıldığında kullanılıp kullanılmayacağını anlatırlar. Public tanımlanan metotlar Remoting ile kullanılabilir. Bir Application Domainden diğer bir Application Domaine metot çağrısı kanallar aracılığı ile yapılır. Veriler kanallardan serialize ve deserialize yöntemleri ile yollanır. Serialize, bir nesneyi ve bu nesnenin tuttuğu veriyi birleştirip saklamaya (dosyaya yazmak, veya bir yerden bir yere yollamak) denilir. Remoting in desteklediği iki türlü serialize yöntemi vardır. SOAP ve Binary, Binary bilindiği gibi iki sisteme dayanır, oldukça hızldır. Veriler daha az yer tutar ve taşınması daha kolay olur. Diğer yöntem SOAP ile yapılan serializasyondur. XML kullanılarak yapılır. Daha yavaştır ancak XML in avantajlarını taşır.

Biraz daha bu işlemin temeline bakalım .Net tede classlar hiyararşik bir yapıya sahiptir (örneğin her class ın temelde object classından türetilmesi gibi). Bir çok nesnede temel olarak Remoting e izin veren class dan türemiştir. Eğer bir nesneye Marshalling (serialize için gereklidir. Marshalllama işi verilerin organize edilmesi toplanması demektir) işlemi uygulanabiliyorsa bu nesne remoting de transfer edilebilir. İki türlü Marshallama nesnesi vardır

1.gifMarshallByRef : Nesneler diğer client ın Application Domaine geçebilirler. Server da sadece bu geçen nesnelerin referansları bulunur.

MarshallByValue : Genellikle nesneler MarshallByValue ile tanımlanırlar. Bu türden nesneler Clienttan bir istek geldiğinde Serverda bu nesnelerin kopyaları oluşturulur ve istemcide bu nesnelerin referansları tutulur. MarshallByValue dan tanımlanmış bir nesnenin içindeki bir metota uzaktan istek geldiğinde Server bu veriyi serialize yöntemine maruz tutar ve bu nesneyi seriileştirir daha sonra seçtiğimiz serialize algoritmasına bağlı olarka nesne client a aktarılır ve clientta da nesne deserialize edilir. MarshallByValue işlemi az verilerde hızlıdır. Referans tuttuğu için ağ trafiğini azaltır. ancak çok büyük veri kümelerinde verinin serialize ve deserialize işlemleri çok zahmetli olabilir.

Verinin bir Application Domain den diğer Application Domaine aktarılması için yani bir uygulamadan diğer uygulamaya aktarılması için kanallar kullanılır. Bir nesne uzaktan bir veriyi çağardığı zaman Remoting Framework kayıtlı bir kanal varmı diye kontrol eder. Kanalın bir ucu serverda diğer ucuda istemcidedir. Kaydedilmiş bir kanal belli bir porttan, belli bir protokol ile veriyi iletir.

Üç türlü kanal vardır. TCP, HTTP ve SMTP, TCP kanalı verileri binary formatında serialize ederek kullanır. HTTP formatı ise verileri XML formatında serialize edip yollar.

.Net çok fazla geliştirilebilir bir yapıya sahiptir. İleride başka kanal türleri yada serialize yöntemleri çıkarsa programlarınızda bunlarıda kullanabilirsiniz.

Kanalları programlarınızda kullanırken Client ve Server olarak kullanabilirsiniz. Ancak .Net Framework de bu şekilde tanımlamadanda kullanabilirsiniz. Remoting Framework bunları ayırd edebilir.

Dim chnSrv As HttpServerChannel = New HttpServerChannel(1234)

Dim chnCli As HttpClientChannel = New HttpClientChannel(1234)

Bu tanımlama hem Server da hemde Clientta aşağıdaki şekildede yapılabilir.

Dim chn As HttpChannel = New HttpChannel(1234)

Bu tanımlamadan sonra oluşturduğunuz kanalı kaydetmeniz gerekiyor.

ChannelServices.RegisterChannel(chn)

Yukarıda tanımlanan kanallarda HTTP yerine TCP yazarsanız TCP kanalı tanımlamış ve kaydetmiş olursunuz.

HTTP kanallarını tanımlamak için

System.Runtime.Remoting.Channels.Http namespacesini projenize eklemeniz,

TCP kanalları tanımlamak için

System.Runtime.Remoting.Channels.Tcp namespacesini projenize eklemeniz gerekiyor.

Verilerin kanallar üzerinden gönderilmeden önce, verilerin belli bir biçime dönüştürülmesini sağlayan (serialize) yönteme Formatters denir.

SOAP ve Binary olmak üzere iki formatters türü vardır.

Yani remoting işlemini yapmadan önce bu iki parametreyi düşünmelisiniz.

HTTP kanalları üzerinden SOAP formatter ı ile XML serialize yönteminimi kullanacaksınız, yoksa TCP kanalları üzerinden Binary formatter ı ile Binary serialize yönteminimi kullanacaksınız.

Bu iki yönteminde kendisine göre avantajları ve dezavantajları vardır.

Örnek olarak TCP kanalını ve binary yöntemini seçerseniz güvenlik duvarlarına (firewall) takılma ihtimaliniz artacak ancak veriler çok daha hızlı iletilecek. Eğer HTTP kanalını ve SOAP formatteri ile XML serialize yöntemini kullanırsanız veriler daha yavaş iletilecek ancak çok daha kolay ve problemsiz şekilde verilerinizi iletebileceksiniz.

İncelenecek son konu Sunucuda aktif olan nesnelerin (Server Activativion Object) yani serverda oluşan nesnelerin ne kadar ve nasıl yaşayacağı, ne zaman hafızadan silineceği ile alakalı. İki türü vardır Singleton yada SingleCall (bölüm 2 de nasıl kullanılacağını göreceksiniz)

Singleton : kaçtane client bağlanırsa bağlansın sadece bir tane nesne server da oluşturulur. Böylece bu nesnede yapılan bir değişiklik hepsine yansır.

SingleCall : aynı anda sadece bir client isteğine cevap verebilir. İstek sona erdiğinde ise sever in hafızasından silinir. Böylece serverin hafızası gereksiz kullanılmamış olur. Ancak her client için yeniden oluşturulduğundan ortak bir data tutmak çok zordur.

Bölüm 2 de Remoting ile ilgili istemcisi Windows Form olan bir örnek yapacağız. Ancak önce Remoting in nasıl çalıştığına aşağıdaki şekilden bir inceleyelim.

2.gif

İkinci bölümde görüşmek üzere.

Link to comment
Share on other sites

Merhabalar. İkinci bölümümüzde .Net Remoting ile ilgili bir Windows Form uygulaması yazacağımız söylemiştim. Hemen başlayalım. 2.gif

Bir Remoting uygulaması yazmak için gerekli olan malzemeler

· Veriyi alan ve karşıda oluşturulmasını istediğimiz nesneyi geri döndürecek metotu içeren nesne

· Bir server programı

· Bir client programı

İlk önce nesnemizi ve Server programını yazacağız. Bunun için Visual Studio .Net imizi açalım ve Visual Basic Project i seçip sol taraftan Console Application ı seçin. İsmine RmtSrv yazalım.

3.gif

Daha sonra varolan bu projeye birde Class Library ekleyelim. Solution Explorer dan solution a sağ tuş tıklayarak Add -> New Project i seçip Class Library i bulun ve ismine RmtNesne yazın.

İlk önce nesnemizi oluşturalım. Nesnemiz SQL server 2000 üstündeki standart olarak bulunan Northwind veritabanından bir tablo çekecek ve bunu istemciye iletecek. Bunun için ilk yapılması gereken System.Data.SqlClient namespace sini import etmektir.

Daha sonra aşağıdaki kodları RmtNesne projenizdeki class ın içine yazın.

Imports System.Data.SqlClient

Public Class RemoteNesne

Inherits MarshalByRefObject

Public Function DsGonder(ByVal sql As String) As DataSet

Dim conStr As String

conStr = "data source=.; initial catalog=northwind; uid=sa; pwd=sa;"

Dim conn As SqlConnection = New SqlConnection(conStr)

Console.WriteLine(sql & " Cümlesi çalışıyor")

Try

Dim da As SqlDataAdapter = New SqlDataAdapter(sql, conn)

Dim ds As DataSet = New DataSet

da.Fill(ds)

Return ds

Catch ex As Exception

Console.WriteLine("Hata oluştu : " & ex.Message)

End Try

End Function

End Class

4.gifNeler yaptığımızı inceleyelim. Class ı oluşturduktan sonra Classı MarshalByRefObject ten türettiğime dikkat edin. Yazdığımız fonksiyon uzaktan kullanılacak fonksiyon. Sql cümleciğini parametre olarak alıyor ve geriye dataset gönderiyor. Diğer işlemler Ado.Net ile alakalı.

İlk önce RmtSrv projemizdeki references klasörüne sağ tuş ile tıklayarak Add References yapalım. Burada ilk ekleyeceğimiz referans System.Runtime.Remoting referansı, diğeri ise solution umuzda bulunan diğer projemiz. İlkini .Net sekmesinden ikincisini ise Project sekmesinden ekleyebilirsiniz.

Şimdi RmtSrv projemizdeki Module1 dosyasının içeriğini yazalım. Bu bizim Server uygulamamız olacak ve Client uygulamalar aslında buraya bağlanacak. Bu class nesnemizi çağaracak ve kanallar vasıtası ile veriyi yollayacak.

İlk uygulamamızı TCP üstünden binnary formatters ile ve binary serialize yöntemi ile yapacağımız için kanallar namespacesindeki eklemeniz gereken namespace in sonu TCP dir. Eğer HTTP ile yollayacaksanız bütün TCP leri HTTP yapmanız yeterli.

Aşağıdaki kodları Module1.vb ye yazın.

Imports System.Runtime.Remoting

Imports System.Runtime.Remoting.Channels

Imports System.Runtime.Remoting.Channels.Tcp

Imports RmtNesne

Module Module1

Sub Main()

Dim chn As TcpChannel = New TcpChannel(1234)

ChannelServices.RegisterChannel(chn)

RemotingConfiguration.RegisterWellKnownServiceType(GetType(RmtNesne.RemoteNesne)

, "DataAl", WellKnownObjectMode.SingleCall)

Console.WriteLine("Server SingleCall Baslatildi")

Console.WriteLine("Entere basarsaniz server kapatilir")

Console.ReadLine()

End Sub

End Module

Yukarıdaki kodu biraz inceleyelim. import edilen namespacelerden TCP ye dikkatiniz çekmek istiyorum onu import ederek chn isimli TCP kanalımızı tanımlıyoruz. Kanalı tanımlarkende port numarasını veriyorum. Port numarasına göre client tan datayı çekeceğim. Kanalı tanımladıktan sonra kaydetmeliyim. Böylece client programı bu kanalı kullanabilecek. Sonraki satırdaki en önemli bölüm. Hangi nesneyi nasıl paketleyip ulaşılması istendiğindede nasıl ulaşılacağını anlatıyor. RegisterWellKnownServiceType ın 3 parametre aldığına dikkat edin. İlk parametre veritürünün ne olacağını soruyor. Namespace.class adı şeklinde yazdığıma dikkat edin. Gettype metotu bu classın türünü veriyor. Sonraki bölüm Client ın kanalı kullanarak hangi datayı alacağını anlatıyor. Son parametre ise sunucuda nesnenin nasıl tutulacağını anlatıyor. İki ihtimal olduğunu hatırlayalım, ilki SingleCall diğeri Singleton. Bu ikisinin farkını ileride anlatacağım.

Nesnemiz ve Serverimiz hazır. Sırada Client ımızı hazırlamak var. Önceki Visual Studio .Net i kapatmadan yeni bir tane daha açın. Böylelikle Client i ve Serveri aynı anda çalıştırabileceğiz.

5.gifYeni bir Windows Application oluşturup adınada RmtWinClient yazın. Oluşan formun üstüne bir textbox, bir button ve birde datagrid yerleştirin. Yandaki gibi düzenleyin.

Şimdi sırada kodları yazmak var.

İlk önce referansları ayarlamamız gerekiyor. Projemizin references klasörüne sağ tuş tıklayarak Add References e basın. Burada System.Runtime.Remoting daha sonra yapacağınız iş az önce oluşturduğumuz nesnemizi yani RmtNesne assembly mizi (RmtNesne.dll classı) de referanslara eklememiz gerekiyor. (şekil 2 deki client ın yanındaki nesnenin görüntüsü) bu bölüm biraz kafa karıştırıcı olabilir. Size Remoting servisini verecek kişi yada kuruluşun size DLL i vermesi gerekiyor. Ancak DLL binary kodlardan oluştuğu için korkulacak birşey yok çünkü kimse binary kodların neler olduğunu anlayamaz ve eğer size bu servisi verenler DLL in yeni sürümünü yazmışlarsa bunu size yollamaları gerekiyor.

Şimdi formumuzun kodlarını yazalım. Aşağıdaki kodları yazmanız gerekiyor.

Imports System.Runtime.Remoting

Imports System.Runtime.Remoting.Channels

Imports System.Runtime.Remoting.Channels.Tcp

Public Class Form1

Inherits System.Windows.Forms.Form

Windows Form Designer generated code

Dim nesnem As RmtNesne.RemoteNesne

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

nesnem = CType(Activator.GetObject(GetType(RmtNesne.RemoteNesne), "tcp://localhost:1234/dataAl"), RmtNesne.RemoteNesne)

DataGrid1.DataSource = CType(nesnem.DsGonder(TextBox1.Text), DataSet).Tables(0)

End Sub

End Class

Şimdi kodların ne iş yaptığına bakalım. Importlar Server in aynısı. İlk önce global olarak nesnemizin türünde bir değişken tanımlaması yapalım (sadece declarion yaptığıma dikkat edin. instance oluşturmuyorum yani new ile nesneye çevirmiyorum) daha sonra button ın Click olayında nesnemin instancesini oluşturuyorum. Activator bana remote olarak nesnemi getiriyor. Activator un GetObject metotu iki parametre ile çalışıyor. İlki Remote olarak çağardığımız nesnenin hangi veritüründen olduğunu anlatıyor. Yine Gettype bana o verinin türünü veriyor. İkincisi ise veriye hangi protokol ile nerede ve hangi porttan ulaşacağımızı anlatıyor. “tcp://” protokolü anlatıyor. “localhost” Remote nesnesinin nerede olduğunu anlatıyor. Buraya bir domain name (örneğin www.bilgeadam.com) yada bir IP yazabilirsiniz. “:1234” ise bu nesnenin hangi porttan yayıldığını anlatıyor. Bu Remoting nesnesinin yayıldığı port (serveri tanımlarken kanalı bu porttan başlatmıştık) son bölüm ise “DataAl” buda server daki remoting nesnemizde verdiğimiz ikinci parametre.

Ctype, Convert Type anlamına geliyor. Activatorun bize getirdiği nesneyi bizim esas nesnemize çeviriyor.

Daha sonra DataGrid1 in datasource sine benim nesnemdeki metotu çağarıyorum. Parametre olarak textbox1 deki yazıyı yolluyorum. (hatırlarsanız DsGonder metodu sql parametresi alıyor ve onu çalıştırıyordu) bu gelen veriyide DataSet nesnesine çeviriyorum ve buradaki ilk tabloyu DataGrid1.DataSource property sine atıyorum.

7.gif

Windows Form uygulamamızı bitirdik. Uygulamayının kodlarını yazmak istemiyorsanız

Please register to see this content.
indirebilirsiniz. Sorularınız için aşağıdaki yorum bölümünü ve e-mail adresimi kullanabilirsiniz.

Bölüm 3 te Client uygulamamız Web Form olacak ve veriyi HTTP protokolü üstünden göndereceğiz. Son olarakta kanal tanımlamalarının XML de tutulmasını anlatacağım.

Bölüm 3 te görüşmek üzere.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...