.Net Remoting - Bölüm 2

.Net Remoting - Bölüm 2 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.

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.

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

Neler 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.

Yeni 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.

Windows Form uygulamamızı bitirdik. Uygulamayının kodlarını yazmak istemiyorsanız buradan 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.

Döküman Arama

Başlık :

Kapat