Makale Özeti

Ön yargıları bir kenara bırakırsak bence remoting uygulaması geliştirmek oldukça kolay ve zevkli bir iş.

Makale

Remoting 4/4

REMOTING ÖRNEK UYGULAMA
(REMOTING - 4)

Ön yargıları bir kenara bırakırsak bence remoting uygulaması geliştirmek oldukça kolay ve zevkli bir iş.

Hangi taraf için kod yazacaksak ona göre aşağıdaki adımların gerektirdiği kodları yazmamız yeterli.

Sunucu tarafında yapılacak işlem:

1.Adım: Uzaktan erişilecek sınıf oluşturulur.
2.Adım: Yeni kanal eklenir.
3.Adım: Uzaktaki sınıfa erişilir.

İstemci tarafında yapılacak işlemler ise:

1.Adım: Yeni kanal eklenir.
2.Adım: Uzaktaki sınıfa erişilir.
3.Adım: Uzaktaki sınıf kullanılır.

Örneğimizde, istemci tarafından, bir sisteme giriş yapılmak istenecek. Eğer giriş için gerekli bilgiler istemci tarafından doğru girildiyse, sunucu üzerinden giriş yapılacak. Eğer sunucumuz çalışmıyor olursa, ulaşmak istediğimiz sınıfa ulaşamayacağımız için, hata ile karşılaşağız.

Şimdi sırayla sunucu ve istemci tarafındaki adımları uygulayalım.

Sunucu tarafında :

Adım1: Uzaktan erişilecek sınıf oluşturulması:

Kullanmak istediğimiz sınıfı dll oluşturarak kullanacağız. Bir ClassLibrary projesi başlatarak adını RemotingFonksiyon olarak verelim.

Public Class NumaraDenetle

    Inherits MarshalByRefObject

    Public Sub New()
        Console.WriteLine("Uzaktan erişilecek sinif fonksiyonlarinı içeren RemotingFonksiyon nesnesi olusturuldu.")
    End Sub

    Dim gecerliMi As Boolean

    Public Function Sinama(ByVal no As String) As Boolean
        If no = "123456" Then
            gecerliMi = True
        Else
           gecerliMi = False
        End If
        Return gecerliMi
    End Function

End Class

Remote edilebilecek nesne, uygulama domaininde marshall edilebilen nesnedir. Bunun haricinde bilinen tüm nesneler non-remotable nesnelerdir. Inherits MarshalByRefObject komut satırını hatırlarsak Remoting-2 (marshalling) bölümünde açıklamıştım.

Çok basit olarak Sinama isimli bir fonksiyon tanımladık. Dışardan gelen değer 123456ya eşitse True değer, yanlışsa False değeri döndermek için geçerliMi isimli bir değişken tanımladık. Biz bu Sinama fonksiyonu içinde aslında çok karmaşık işlemler yaptırtabiliriz. Okul numarasını denetleyebiliriz. Bu sayede istemci olan öğrencinin başkasının notlarını görmesini engelleyebiliriz.


1.Şekil: dllin klasörde oluşması.

Bu şekilde projemizi çalıştırdığımızda, dllimiz bin klasörünün içinde oluşmuş olacaktır.

2.Adım: Sunucu tarafında kullanılacak kanal oluşturturulması:

Sunucu tarafını oluşturmak için, ConsoleApplication uygulaması başlatalım. Konsol uygulamasının adını RemotingSunucu olarak verelim.

Sunucu tarafında Remoting isim uzayını kullanmak için ilk olarak referans göstermemiz gerekiyor. Bunun içinde, Solution Explorerda proje üzerine sağ tıklayıp, Referans Add seçeneği aracılıyla System.Runtime.Remoting isim uzayını referans gösteririz..


2.Şekil: Remoting isim uzayını referans etme.

Referans gösterdikten sonra gerekli isim uzaylarını kullanmak için Imports deyimini ile projemize ekliyoruz.

Imports System.Runtime.Remoting
Remoting uygulamasi gelistirmek için gerekli olan isim uzayi

Imports System.Runtime.Remoting.Channels
Kanallari kullanmak için gerekli olan isim uzayi

Imports System.Runtime.Remoting.Channels.Tcp
Tcp kanalini kullanmak için gerekli olan isim uzayi

Imports System.Runtime.Remoting.Channels.Http
Http kanalini kullanmak için gerekli olan isim uzayi

Oluşturduğumuz RemotingFonksiyon isimli dlli kullanmak için de, projemizin içinden oluşturduğumuz dlle referans gösteriyoruz. Add Referans dedikten sonra Projects sekmesini tıklayıp, Browse komut düğmesi ile dllin yerini gösteriyoruz.


3.Şekil: RemotingFonksiyon isimli dlli referans gösterme.

Projemize ekliyoruz.

Imports RemotingFonksiyon
RemotingFonksiyonun içindeki fonksiyonları kullanmak için.

Referansları ekledikten ve gerekli isim uzaylarını projemize yazdıktan sonra, sıra Main bloğuna kod yazmaya geldi.

Module Module1
     Sub Main()
        Console.WriteLine("Sunucu çalistiriliyor. Bekleyiniz....")  
        Ekrana çalıştığı ile ilgili mesaj yazdırıyoruz.

Şimdi sıra hangi kanalı kullanacağımızı belirlemeye geldi.

Tcp kanalı kullanmak için :

        Dim kanal As TcpChannel = New TcpChannel(8085)
        ChannelServices.RegisterChannel(kanal)

Http kanalı kullanmak için :

        Dim kanal As HttpChannel = New HttpChannel(8085)
        ChannelServices.RegisterChannel(kanal)

Hangi kanalı kullanmak istiyorsanız projenize o kodu yazın. Tcp kanalını kullanmak için, Tcp için olan kodu, Http kanalını kullanmak için Http için olan kodu projenize yazın. Bu şekilde hangi kanalı kullanacağımızı(Tcp veya Http) ve 8085 portunu kullanacağımızı bildiriyoruz.

Ben Tcp kanalını kullandım.

3.Adım: Uzaktaki sınıfa erişilir.

Hatırlarsak Sunucu Çalıştırmalı Nesneler (Server Activition Object) ve İstemci Çalıştırmalı Nesneler (Client Activition Object) vardı (Remoting- 3).

Sunucu çalıştırmalı nesneler iki metodlar çalıştırılıyordu. SingleCall ve Singleton yöntemleri. (Remoting-3)

Herbir yöntem için kodları yazıcam. Bunlardan, sizin tasarladığınız projenize uygun olanını seçerek kullanmanız gerekir.

Sunucu çalıştırmalı türünden :

1.SingleCall için:

        SingleCall için:

        RemotingConfiguration.RegisterWellKnownServiceType(GetType(NumaraDenetle), _
             "RemotingOrnek", WellKnownObjectMode.SingleCall)

2.Singleton için:

        Singleton için:

        RemotingConfiguration.RegisterWellKnownServiceType(GetType(NumaraDenetle), _
             "RemotingOrnek", WellKnownObjectMode.Singleton)

İstemci çalıştırmalı nesneler için:

        Istemci Çalistirmali Nesneler için:
        RemotingConfiguration.RegisterActivatedServiceType(GetType(NumaraDenetle))

Ben sunucu çalıştırmalı nesnelerden, Singleton çalıştırma modu ile uzaktaki nesneye ulaşacağım.

Bu şekilde sunucu tarafındaki işimizi bitirmiş olduk.

Şimdi sıra kullanıcı, yani istemci tarafında proje oluşturmaya geldi.

İstemci tarafında :

Bir tane WindowsApplication başlatalım. RemotingIstemci olarak isimlendirelim.

Formumuza bir komut düğmesi(btnGecerliMi) ve metin kutusu(txtNumara) ekleyelim.


4.Şekil: Form Tasarımı.

Gerekli isim uzaylarını kullanmak için, sunucu tarafında olduğu gibi System.Runtime.Remoting isim uzayını referans ediyoruz. Yine aynı şekilde uzakta erişmek istediğimiz sınıfı kullanmak için RemotingFonksiyon isimli dlli referans ediyoruz. Projemize Imports deyimiyle ekliyoruz.

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Channels.Http
Hangi kanalı kullanacak o isim uzayını import ederiz.

Imports RemotingFonksiyon

Eklediğimiz referansları kullanmak için import ettik.

1.Adım: Yeni kanal eklenir.

Sunucu tarafında olduğu gibi hangi kanalı kullacaksak, port numarası belirterek bir kanal oluşturuyoruz.

Tcp kanalı kullanmak için :

        Dim kanal As TcpChannel = New TcpChannel(8085)
        ChannelServices.RegisterChannel(kanal)

Http kanalı kullanmak için :

        Dim kanal As HttpChannel = New HttpChannel(8085)
        ChannelServices.RegisterChannel(kanal)

Not: Sadece kullanacağınız kanalın kodunu projenize ekleyin.

2.Adım: Uzaktaki sınıfa erişme işlemi.

Sunucuda nesneye erişmek için kullandığımız gibi, istemci tarafında da iki metodla nesneye erişebiliriz. SingleCall ve Singleton yöntemleri. (Remoting-3).

Yine herbiri için gerekli olan kodu yazıcam. Siz sadece kendi işinize yarayanı projenize ekleyin.

Sunucu çalıstırmalıolarak:

        RemotingConfiguration.RegisterWellKnownClientType(GetType(NumaraDenetle), "tcp://localhost:8085/RemotingOrnek")

İstemci çalıştırmalıolarak:

        RemotingConfiguration.RegisterWellKnownClientType(GetType(NumaraDenetle), "tcp://localhost:8085")

Ben sunucu çalıştırmalıyı projeme ekledim.

3.Adım: Uzaktaki sınıfın kullanılması.

Kullanmak istediğimiz nesneden türeterek NumaraDenetle sınıfını kullanıyoruz.

        Dim denetle As New NumaraDenetle

sina isimli bir boolean değişken tanımlayarak, sınıftan dönen değeri tutuyoruz. Dönen değere göre, ekrana mesaj verdiriyoruz.

        Dim sina As Boolean
        sina = denetle.Sinama(txtNumara.Text)

        If Not sina Then
            MessageBox.Show("Numaranız Geçersiz!")
        Else
            MessageBox.Show("Numaranız geçerli.")
        End If

    End Sub
End Class

Bu şekilde istemci tarafında da işimizi bitirdik.

Şimdi yapmış olduğumuz projeleri çalıştıralım.

İlk önce sunucu tarafındaki, konsol uygulamasını çalıştıyoruz.


5.Şekil: Sunucunun çalışıyor olması.

Ekrana Sunucu aktif.. yazısı gelince, sunucu tarafı, kullanıcıdan istek beklemeye başlar. Sonra kullanıcı tarafında oluşturmuş olduğumuz RemotingIstemci isimli projeyi çalıştıralım. Metin kutusuna sayı girdiğimizde, ekrana girilen sayının geçerli olup olmadığına dair ileti kutusu gelecektir. Metin kutusuna ancak 123456 sayısını girince Numaranız geçerli. onayını alabiliriz. Bunun sebebide, Denetle isimli fonksiyonda, dışardan gelen sayı eğer 123456 ise kabul et demiştik. Bu sınama, oluşturmuş olduğumuz RemotingSunucu konsol uygulaması aracılığı ile RemotingFonksiyon isimli dllde gerçekleştirilmektedir.


6.Şekil: 123456 değerinin girilmesi ile Numaranız geçerli iletisinin alınması.

İstemci tarafında, hangi işlemi gerçekleştiriyor olursak olalım, sunucunun aktif olarak çalışıyor olması gerekir. Aksi takdirde, istemci istediği işlemleri gerçekleştiremicektir.

Try-Catch hata mekanizmasını da benim gibi kullanmazsanız; aşağıdaki hatayı alırsınız:


7.Şekil: Sunucunun çalışmaması halinde alınan hata.

Bu uygulama birşeyi hatırlatıyor olmalı size. Evet: web wervislerini. Peki farkları neler. Onlara da Remoting-1 makalesinde değinmiştik.

Bu şekilde remoting uygulaması geliştirmiş olduk.Remoting uygulamaları geliştirmenin kolay ve zevkli olduğunu söylemiştim size. Sizce?

Öznur KARAKUŞOĞLU
SQLNedir?com