Django ve Socket.io ile Gerçek Zamanlı Uygulamalar – 4. Bölüm

Merhabalar,

Bu yazımızda Python kullanarak socket.io sunucularına nasıl bağlanabileceğimizden bahsedeceğim. Bu iş için socketIO-client kütüphanesini kullanacağız. Bu kütüphaneyi kurmak için aşağıda ki komutu çalıştırıyoruz.

pip install socketIO-client==0.3

Bu işlemi yaptıktan sonra bir önceki yazımızda oluşturduğumuz Django projesinin içersine scripts isminde bir klasör oluşturuyoruz. Bu klasörde projelerimizde direk django ile iç içe olmayan yardımcı betiklerimizi depolayacağız. Oluşturduğumuz bu klasör içersine ilk betiğimizi oluşturalım. İlk betiğimizin adı socketIO_client.py olsun.

Burada yapacağımız tanımla javascript kullanarak hazırladığımız istemci kodundan çok farklı değil. Burada ki tek fark socket.io üzerinden gelecek mesajların direk bir fonksiyona değil bir sınıfın fonksiyonları tarafından işlenecek olmasıdır. İstemci kodunu yazmamızı sağlayan bu sınıf BaseNamespace sınıfından türetilmelidir. BasNamespace sınıfını socketIO_client mödülünden betiğinize dahil edebilirsiniz.

ilk örnek sınıfımızı yazalım.

from socketIO_client import SocketIO, BaseNamespace
class HelloSocketIOClient(BaseNamespace):
    def on_connect(self, socketIO):
        print '[Baglanti kuruldu]'

    def on_disconnect(self):
        print '[Baglanti kesildi]'

Bu oluşturduğumuz sınıf, bağlantı kurulduğunda ve bağlantı kesildiğinde sadece ekrana bu bilgileri basacak. Her hangi bir veri alışverişi tanımlamadık. Peki bağlantıyı nasıl sağlıyoruz. Aşağıdaki kodları inceleyelim.

socketIO = SocketIO('127.0.0.1', 8000)
chatSocket = socketIO.connect('/chat', Namespace)
socketIO.wait()

İlk satır ile hangi sunucuya bağlanacağımızı verdiğimiz host ve port bilgileri ile belirliyoruz. Daha sonra bu sunucu üzerindeki hangi kanala bağlantı açacağımızı ve hangi sınıfın bu bağlantıdan sorumlu olacağını belirtiyoruz. 3. satır ise bu bağlantının sonlanmasını bekleyen fonksiyondur. Bu fonksiyon sayesinde betiğimiz bağlantı tamamlanana kadar çalışmaya devam edecektir. Ufak bir not: 2. satırı farklı sınıf ve farklı kanallar için birden çok kez kullanmamız mümkün.

Şimdi öncelikle run.py ile django projemizi çalıştıralım. Ardından yeni yazmış olduğumuz socketIO_client.py dosyamızı çalıştıralım. Bu adımda SocketIO bulunamadı gibi bir hata mesajı ile karşılaşabilirsiniz. Virtualenv ortamında betiğimizin başına bu satırları ekleyebilirseniz sorunumuz çözülecektir. 4. satırda belirtilen klasör yolunun kurulumunu yaptığımız kütüphaneyi barındırdığından emin olun ve gerekirse kodu güncelleyiniz.

import os
import sys
sys.path.append(os.environ['VIRTUAL_ENV']+'/lib/python2.7/site-packages/')

Bu adımı da tamamladık.

Şimdi sırada diğer komutları eklemek var.
Öncelikle sunucuya kayıt olmak için subscribe etiketi ile başlamalıyız. Bu yüzden on_connect fonksiyonuna ekleme yapıyoruz.

def on_connect(self, socketIO):
    print '[Baglanti kuruldu]'
    self.socketIO.emit('subscribe' , {'my': 'mynick'});

Burada kullandığımız son satır sunucuya verı göndermek için kullanılmıştır. Sunucuda gelebilecek diğer mesajlar ise welcome ve message’tır. Bu mesajları işlemek için on_welcome(self, id, message) ve on_message(self, id, message) fonksiyonlarını eklememiz yeterlidir.

Peki biz sunucuya veri göndermek istersek. Örnek olarak bir kaynaktan okuduğumuz veriyi sunucuya göndermek istersem, yapılması gereken oldukça basit. Bu işlem için sunucu tarafında daha önceden hazırlamış olduğumuz update etiketini kullanabiliriz, bu sayede sunucuya göndermiş olduğumuz veriler istemcilere mesaj olarak gönderilirebilir olacaktır.

Yapılması gereken tek şey bağlantı açıldıktan sonra belli aralıklarla yada yeni veri gelişine göre veri göndermek olacaktır. Bu işlem için aşağıda ki kodu kullanabiliriz.

socketIO = SocketIO('127.0.0.1', 8000)
chatSocket = socketIO.connect('/chat', Namespace)

newData = readNewData()
chatSocket.emit('update', newData)

socketIO.wait()

Umarım işinize yarar.

İyi haftalar

Tagged with: ,
Posted in yakindanegitim

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives