Remoting ile doğrulama

Yağız Gönüler tarafından yayınlanmıştır 13. Ağustos 2008 12:00

Bu örneğimizde amacımız oluşturacağımız bir nesnede, kullanıcı adı ile şifre doğrulaması yapılması ve sunucu ile bunu yayınlayıp diğer istemcilerden kullanılmasının sağlanmasıdır.

 

İlk önce kullanıcıların verilerini tutacak çok basit bir veritabanı hazırlayalım. Ben ismini RemotingDB dedim, veritabanı içinde Users isimli bir tablo yarattım ve bilgilerini aşağıdaki şemadaki gibi girdim;

 

 

Şimdi ise yeni bir Windows Uygulaması açıyoruz. Ben ismine RemotingSunucu dedim. Daha sonra yine bu solutiona yeni bir Class Library ekleyin. Ben ismini RemotingNesne dedim. Burada ilk önce nesnemizi oluşturacağız. Nesnemiz ADO.NET ile veritabanına connected ortamda bağlanıp, aradığımız nesne var mı diye kontrol edecek. Aşağıdaki kodları Class Library’imize yazıyoruz;

 

Imports System.Data.SqlClient

 

Public Class RemotNesne

 

    Inherits MarshalByRefObject

 

    Public Function Dogrula(ByVal uName As String, ByVal uPass As String) As String

 

        Dim conn As SqlConnection

        conn = New SqlConnection("data source=.; initial catalog=RemotingDB; uid=sa, password=;")

        Dim sql As String

        sql = "select UserRName from Users Where UserName= '" & uName & "' AND UserPassword= '" & uPass & "'"

        Dim comm As SqlCommand = New SqlCommand(sql, conn)

        conn.Open()

        Dim dr As SqlDataReader = comm.ExecuteReader

        If dr.HasRows Then

            dr.Read()

            Return dr.GetString(0)

        Else

            Return ""

        End If

 

    End Function

 

End Class

 

Bu kodlarla öncelikle sql server 2000’e erişmek için gerekli olan namespace’i ekledim. Daha sonra aktivasyon kullanabilmek için MarshallByRefObject türettim. Bir public function yazdım, bildiğimiz gibi Remoting’de bir methodun kullanılabilmesi için mutlaka public olarak tanımlanması gerekiyor. Bu function string türden parametre alıyor ve geriye yine string döndürüyor. Fonksiyonda ilk önce connection yapılıyor sonra command ile veritabanında sorgu çalıştırılıyor ve daha sonra bu sorgunun sonucu bir DataReader’a atılıyor. Eğer yoksa boş olarak geri dönüyor.

 

Şimdi bu nesneyi yayınlayacak olan sunucu uygulamasını yapıyoruz. Bunun için aşağıdaki resimdeki gibi, bir textbox’ın text özelliğini silip multiline özelliğini true yaparak formumuza geniş olarak ekliyoruz;

 

 

Yukarıdaki görüntüyü elde etmek için hemen aşağıda belirteceğim kodları yazıyoruz. Kodlarımızda ise değişik gelebilecek tek şey RemotingConfiguration classının RegisterActivatedServiceType shared metodunun kullanılması olabilir. Bu metod istemci taraflı aktivasyon yapmak için kullanılıyor, nesnenin veri türü alınıyor, RegisterWellKnownServiceType’taki gibi bir Remoting yolu almıyor. Aşağıdaki kodları yazıp nesnemizi çalıştırdığımızda yukarıdaki form görüntüsü ile karşılaşıyoruz;

 

Imports System.Runtime.Remoting

Imports System.Runtime.Remoting.Channels

Imports System.Runtime.Remoting.Channels.tcp

 

Public Class Form1

    Inherits System.Windows.Forms.Form

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

        TextBox1.Text = "Sunucu Açıldı" & vbNewLine

        Dim chn As TcpChannel = New TcpChannel(8989)

        ChannelServices.RegisterChannel(chn)

 

        RemotingConfiguration.RegisterActivatedServiceType(GetType(RemotingNesne.RemotNesne))

        TextBox1.Text &= "Sunucu, İstemci aktivasyonu ile çalışıyor"

 

    End Sub

 

End Class

 

 

Şimdi sırada istemcimizi yazmak var. İstemci için farklı bir Windows Uygulaması oluşturuyoruz. Ben ismine RemotingIstemci yazdım. İstemcimizin formuna 3 label, 2 textbox ve 1 button yerleştirip aşağıdaki görüntüyü elde ediyoruz;

 

 

Buttonumuzun tıklama olayına aşağıdaki kodları yazıyoruz;

Imports System.Runtime.Remoting

 

Public Class Form1

    Inherits System.Windows.Forms.Form

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

 

        Static i As Boolean

 

        If Not i Then

 

         RemotingConfiguration.RegisterActivatedClientType(GetType(RemotingNesne.RemotNesne), _

            "tcp://Localhost:8989")

            i = True

 

        End If

 

        Try

            Dim nesnem As RemotingNesne.RemotNesne = New RemotingNesne.RemotNesne

            Dim donusdegeri As String = nesnem.Dogrula(TextBox1.Text, TextBox2.Text)

            If CBool(Len(donusdegeri)) Then

                Label1.Text &= "Merhabalar" & donusdegeri

            Else

                Label1.Text &= "Kullanıcı Adı ve7veya Şifre Hatalı!"

            End If

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

 

    End Sub

 

End Class

 

Bir kanala bağlantıyı 1 kere kurup nesneyi kendi uygulamamızın domaninie geçirdikten sonra bir daha aynı nesneye geçiremeyiz. Bunun için ben i’yi static boolean anahtar değişkeni tanımladım, sadece 1 kere çalışması için gerekli kodları yazdım. Bu metot RegisterActivatedClientType metodu, ilk parametresi nesnenin veri türünü, ikinci parametresi ise nesnenin yolunu istiyor. TCP kanalını kullanmıştık ve 8989 no’lu porttan yayın yapıyorduk. Remoting uygulamalarda sıkça problem oluşabileceği için try catch bloğunu da yazıyoruz.

 

Uygulamamızı çalıştırdıktan sonra veritabanımızı kullanarak, bir kanal yoluyla verilerimizi yolluyoruz ve sonucumuzu, sonuc label’ında bize geri dönen değer ile görüyoruz.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , ,

Articles | Database | Windows

Yorum ekle


(Gravatar simgesini gösterecek)  

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.
Sitedeki kod ve tasarım değişiklikleri ise Yağız Gönüler tarafından geliştirilmiştir.
2008 © www.yagizgonuler.com

Şifahen değil acilen!

Anket

Yazılım geliştirirken en keyif aldığınız alan hangisi?




Sonuçlar

Son Yorumlar

Comment RSS

Calendar

<<  Ocak 2009  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

Yazıları geniş takvimde göster

Ne Dinliyorum?

Kirpi - TearDrop (11 saat önce)
Kirpi - My Name Is Kirpi (11 saat önce)
Kirpi - The Song (11 saat önce)
Kirpi - Spell (11 saat önce)
Huseyin Karadayi - Bonus Track Funk Clarinet (String Mix) (11 saat önce)
Huseyin Karadayi - Sacred Gate (11 saat önce)
Huseyin Karadayi - Exotica (11 saat önce)
Huseyin Karadayi - Take Me Away / No Time To Waste (Vocal By Melis Sökmen) (11 saat önce)
Huseyin Karadayi - Eyes Don't Lie (Duet By Enoi & Funky C) (11 saat önce)
Huseyin Karadayi - This Way (Usy Groove) (11 saat önce)

Ne Okuyorum?


Haftanın Sözü


"Sukûnetim asaletimdendir;
Lâkin her lâfa verilecek bir cevabım var.
Bir bakarım lâf lâfmı diye,
Birde bakarım söyleyen adammı diye.."

Mevlânâ Celaleddin-i Belhi Rumi
(1207-1273)

Adanmış Hayatlar

"Zaten aşklar hep yalan dolan,
Sonu hep acı hüsran.
Bize her sevdadan geriye kalan
Sadece Galatasaray..
"

Son Dakika

İstanbul'da Hava

ISTANBUL

Ziyaretçi Sayısı

Ziyaretçi Sayısı