
|
||||||
| Bu Bölümlerimizi İncelediniz mi ?: |
Şimdi ÜCRETSİZ Üye Ol!
|
Silverlight 2.0 ve Socket Programlama Mucizesi
Silverlight, Expression, LinQ, Ajax, JavaScript
![]() |
|
|
LinkBack | Seçenekler | Stil |
|
|
#1 | |||
|
Hayat İşte...
![]() 11 Oca 2008
Dünyadan
:
![]() Yaş: 24
Ruh hali:
![]()
Ettiği Teşekkür: 1,244
417 Mesajına 625 Kere Teşekkür Edlidi
Tepki Sayısı: 3
23 Mesajına 26 Kere Tepki Gösterildi |
Socket programlama Silverlight çıktığından beri biz yazılım geliştiricilerin en büyük hayali ve bu hayal gerçek oluyor. Silverlight 2.0 Beta 1 ile beraber Socket Programlama karşımızda. Yani artık istemci ile sunucu arasında TCP/IP ile haberleşmek mümkün. Tabi belirli kurallar var; bu kurallardan ilki sunucudaki uygulamanın istemci uygulamanın yüklendiği web sitesi ile aynı konumda olması. Yani sunucu uygulamanızın web siteniz ahmet.com ise ahmet.com'un reverse DNS Look-Up ile bakıldığında çıkan IP adresine sahip sunucuda bulunması gerekiyor. Bu durumun Silverlight'ın Beta 1 sonrası sürümlerinde policyfile gibi sistemlerde daha esnek hale getirileceği söylentiler arasında fakat baktığımızda şu anki hali ile bile süper bir potansiyel söz konusu.
Peki nedir bunun avantajı? Diyorum ya, hayalimizdi diye, peken neden? Web sitelerinde güncel bilgi göstermek her zamanki en büyük derttir. Bunu yapabilmek için çok eskilere döndüğümüzde bazı meta tagları ile belirli aralıkla sayfanın refresh atmasını sağladığımız günler bile olurdu. IFRAME vs nin gelmesi ile en azından bunu sayfada kısmi bölümlerde uygulayabilir hale geldik. Sonrasında AJAX geldi ve çok daha sinsi bir şekilde kullanıcı farkında olmadan belirli aralıklarla sunucudan yeni veri talebinde bulunarak sayfa değişmeden yeni içeriği gösterebildik. Oysa hep bizi rahatsız eden bir nokta vardı, o da şu; sürekli istemciden sunucuya bağlanarak bir veri değişikliğinin olup olmadığını kontrol etmek durumunda kalıyorduk. Sunucuya "Yeni birşey var mı?" diye dakikada bir soruyor ve çoğunda da hüsran ile geri dönüyordu. Keşke sunucu bize bir "Alo" diyebilse ve değişiklik olduğunda istemciyi haberdar edebilse? Teknik olarak bu güvenlik sebepleri nedeniyle zaten mümkün değil çünkü bir istemci bilgisayara dışarıdan içeriye bağlantı kuramazsınız (kuramamanız gerekir). Peki nasıl oluyor da Socket Programming bunu aşıyor? Aslında aşmıyor, yine istemci sunucuya bağlanıyor fakat söz konusu bağlantı TCP bazında olduğu herhangi bir trafiğe neden olmadan sürekli açık tutulabiliyor. Durum böyle olunca sunucu kendisine bağlı istemciye istediğinde söz konusu bağlantı üzerinden rahatlıkla ulaşabiliyor. Sunucu tarafından işe başlayalım. İlk olarak sunucudaki programımızı hazırlayalım. Söz konusu program kendisine gelen tüm istekleri karşılayarak gerektiğinde istemcilere veri gönderecek. Bizim programımız içerisinde bir TextBox bulunacak ve kutu içerisine metin yazıldıkça kendisine bağlı tüm istemcilere bu metin sürekli gönderilecek. HTML-Kodu:
Dim Baglilar As New System.Collections.Generic.List(Of System.IO.StreamWriter)
Dim yeniTR As System.Threading.Thread
Dim TCPBaglantilari As New System.Threading.ManualResetEvent(True)
Dim Dinleyici As New System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 4530)
HTML-Kodu:
Private Sub btn_Basla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Basla.Click
yeniTR = New System.Threading.Thread(AddressOf Bekle)
yeniTR.Start()
End Sub
HTML-Kodu:
Sub Bekle()
Dinleyici.Start()
While True
TCPBaglantilari.Reset()
Dinleyici.BeginAcceptTcpClient(New System.AsyncCallback(AddressOf BaglantiGeliyor), Nothing)
TCPBaglantilari.WaitOne()
End While
End Sub
HTML-Kodu:
Private Sub BaglantiGeliyor(ByVal ar As System.IAsyncResult)
TCPBaglantilari.Set()
Dim Musteri As System.Net.Sockets.TcpClient = Dinleyici.EndAcceptTcpClient(ar)
If Musteri.Connected Then
Dim yazici As New System.IO.StreamWriter(Musteri.GetStream)
yazici.AutoFlush = True
Baglilar.Add(yazici)
yazici.Write("Bağlandınız.")
End If
End Sub
Unutmayın ki uygulamamızda bir TextBox vardı ve içerisine birşey yazıldığında tüm bağlı kullanıcılara gönderecektik. Bunun için sonra kullanabilmek adına elimizdeki canlı Stream'leri saklamak sorundayız. Global olarak tanımladığımız Baglilar adında Generic.List'e elimizdeki Stream'i aktarıyoruz. Bu arada kullanıcıya "Bağlandınız" diye de bir metin gönderiyoruz. HTML-Kodu:
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
For Each x As System.IO.StreamWriter In Baglilar
x.Write(TextBox1.Text)
Next
End Sub
İstemci tarafında neler olacak? Silverlight tarafında çok basit görsellikte bir uygulamamız olacak. Sadece bir TextBlock! Uygulama tarayıcı içerisinde ilk açıldığında sunucuya bağlanacak ve gelen veriyi sürekli olarak söz konusu TextBlock içerisinde gösterecek. HTML-Kodu:
<UserControl x:Class="SocketsClient.Page" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <TextBlock Margin="42,46,37,125" Text="TextBlock" TextWrapping="Wrap" x:Name="Metin"/> </Grid> </UserControl> HTML-Kodu:
Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Dim Hat As New System.Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
Dim Args As New System.Net.Sockets.SocketAsyncEventArgs
Args.UserToken = Hat
Args.RemoteEndPoint = New System.Net.DnsEndPoint("localhost", 4530)
AddHandler Args.Completed, AddressOf Baglandi
Hat.ConnectAsync(Args)
End Sub
HTML-Kodu:
Private Sub Baglandi(ByVal sender As Object, ByVal e As System.Net.Sockets.SocketAsyncEventArgs)
Dim Gelen(1024) As Byte
e.SetBuffer(Gelen, 0, Gelen.Length)
RemoveHandler e.Completed, AddressOf Baglandi
AddHandler e.Completed, AddressOf Geldi
Dim Baglanti As System.Net.Sockets.Socket = CType(e.UserToken, System.Net.Sockets.Socket)
Baglanti.ReceiveAsync(e)
End Sub
Geldi ve Baglandi metodları aslında Silverlight içerisinde ayrı bir Thread içerisinde çalışıyor. Bu nedenle tüm bu işlemler yapılırken kullanıcının uygulama ile olan interaktivitesi kesinlikle kesilmiyor. Tabi ayrı bir Thread gibi davranıyor olmasını dezavantajı ise birazdan karşımıza çıkacak. Kısır döngü içerisinde süreki ReceiveAsync ile sunucuyu dinlerken istemci tarafında görsel arayüzde değişiklik yapamayacağız. Bu da bizim sunucudan veri alabilmemizi fakat ekranda göstermememize neden olacak. Tabi demokrasilerde çare tükenmez... HTML-Kodu:
Delegate Sub MyDelegate(ByVal myArg2 As String)
Sub GelGel(ByVal x As String)
Metin.Text = x
End Sub
HTML-Kodu:
Private Sub Geldi(ByVal sender As Object, ByVal e As System.Net.Sockets.SocketAsyncEventArgs)
Dim Gelen As String = System.Text.Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred)
Me.Dispatcher.BeginInvoke(New MyDelegate(AddressOf GelGel), New String() {Gelen})
Dim Baglanti As System.Net.Sockets.Socket = CType(e.UserToken, System.Net.Sockets.Socket)
Baglanti.ReceiveAsync(e)
End Sub
Son olarak hem istemci hem de sunucu uygulamanın tam kodunu sizlerle paylaşmak istiyorum. [İstemci: Silverlight uygulaması] HTML-Kodu:
Partial Public Class Page
Inherits UserControl
Public Sub New()
InitializeComponent()
End Sub
Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Dim Hat As New System.Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
Dim Args As New System.Net.Sockets.SocketAsyncEventArgs
Args.UserToken = Hat
Args.RemoteEndPoint = New System.Net.DnsEndPoint("localhost", 4530)
AddHandler Args.Completed, AddressOf Baglandi
Hat.ConnectAsync(Args)
End Sub
Private Sub Baglandi(ByVal sender As Object, ByVal e As System.Net.Sockets.SocketAsyncEventArgs)
Dim Gelen(1024) As Byte
e.SetBuffer(Gelen, 0, Gelen.Length)
RemoveHandler e.Completed, AddressOf Baglandi
AddHandler e.Completed, AddressOf Geldi
Dim Baglanti As System.Net.Sockets.Socket = CType(e.UserToken, System.Net.Sockets.Socket)
Baglanti.ReceiveAsync(e)
End Sub
Private Sub Geldi(ByVal sender As Object, ByVal e As System.Net.Sockets.SocketAsyncEventArgs)
Dim Gelen As String = System.Text.Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred)
Me.Dispatcher.BeginInvoke(New MyDelegate(AddressOf GelGel), New String() {Gelen})
Dim Baglanti As System.Net.Sockets.Socket = CType(e.UserToken, System.Net.Sockets.Socket)
Baglanti.ReceiveAsync(e)
End Sub
Delegate Sub MyDelegate(ByVal myArg2 As String)
Sub GelGel(ByVal x As String)
Metin.Text = x
End Sub
End Class
HTML-Kodu:
Public Class Form1
Dim Baglilar As New System.Collections.Generic.List(Of System.IO.StreamWriter)
Dim yeniTR As System.Threading.Thread
Dim TCPBaglantilari As New System.Threading.ManualResetEvent(True)
Dim Dinleyici As New System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 4530)
Private Sub btn_Basla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Basla.Click
'İzin Verilen Port Aralığı 4502-4532
yeniTR = New System.Threading.Thread(AddressOf Bekle)
yeniTR.Start()
End Sub
Sub Bekle()
Dinleyici.Start()
While True
TCPBaglantilari.Reset()
Dinleyici.BeginAcceptTcpClient(New System.AsyncCallback(AddressOf BaglantiGeliyor), Nothing)
TCPBaglantilari.WaitOne()
End While
End Sub
Private Sub BaglantiGeliyor(ByVal ar As System.IAsyncResult)
TCPBaglantilari.Set()
Dim Musteri As System.Net.Sockets.TcpClient = Dinleyici.EndAcceptTcpClient(ar)
If Musteri.Connected Then
Dim yazici As New System.IO.StreamWriter(Musteri.GetStream)
yazici.AutoFlush = True
Baglilar.Add(yazici)
yazici.Write("Bağlandınız.")
End If
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
For Each x As System.IO.StreamWriter In Baglilar
x.Write(TextBox1.Text)
Next
End Sub
End Class
Kaynak: [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] |
|||
İmzam![]() |
|
![]() |
| Bookmarks |
| Etiketler |
| mucize, silverlight, silverlight 2.0, socket programlama |
«
Silverlight 2.0 içerisinde ScrollViewer kullanımı.
|
Silverlight 2.0 Calendar ve DatePicker kontrolleri.
»
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Seçenekler | |
| Stil | |
|
|
Benzer Konular
|
||||
| Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
| Sayfa içi Silverlight uygulamaları | XiLoNeN | Silverlight, Expression, LinQ, Ajax, JavaScript | 0 | 26-05-2008 15:27 |
| ASP.NET ile Silverlight XAML Yaratalım | XiLoNeN | Silverlight, Expression, LinQ, Ajax, JavaScript | 0 | 26-05-2008 15:24 |
| Silverlight 1.0 ve HTML Kontrolleri | XiLoNeN | Silverlight, Expression, LinQ, Ajax, JavaScript | 0 | 26-05-2008 15:22 |
| Peygamberimiz (sav)'in En Büyük Mucizesi: Kuran-i Kerim | akasya | Dini Paylaşım | 0 | 16-05-2008 11:53 |
WEZ Format +3. Şuan Saat: 21:17.

































Normal


