Blog Archive

Friday, May 28, 2010

RTMP(Real Time Messaging Protocol) Protokolü

Diyelim ki Flash player kullanarak bir oyun yazmak istiyoruz. Çok kullanıcılı olmasını da istiyoruz. İşi biraz basit tutalım ve diyelim ki tic-tac-toe gibi bir oyun.
Bu noktada karşımıza ilk çıkan sorun hamlelerin oyuncular arasında iletilmesi olacaktır. O halde problemimizi daha basit bir çözüme odaklayalım ve diyelim ki eğer oyuncular arasında sohbeti sağlayabilirsek, aynı şekilde de hamlelerin iletişimini de sağlayabiliriz.
Flash Player'in ilk sürümlerinden bu işi yapmak için XMLSocket kullanılıyordu. Java, C++ gibi sistem kaynaklarını ve ağı kullanabilecek bir dille XMLSocket Server uygulaması yazılıyor ve XMLSocket sınıfı ile haberleşme sağlanıyordu. Bazende Flash programcıları hazır bir socket server kullanmayı tercih ediyorlardı. Hatta bu sunuculardan en meşhuruda smartfoxserver olsa gerek.

XMLSocket sınıfı halen kullanılabilir durumda olmasına rağmen bu gün pek çok multiplayer oyun geliştiricisi FMS(Flash Media Server), Red5, WebOrb gibi sunucuları tercih etmektedir. Bu sunucuları XMLSocket server uygulamalarından ayıran en önemli özellik ise RTMP protokolü üzerinden AMF mesajlaşma formatı ile haberleşme sağlıyor olmasıdır.

RTMP: Real Time Messaging Protocol(Gerçek zamanlı mesajlaşma protokolü) anlamına gelmektedir. Bu protokol üzerinden serialize edilebilen nesneler, Ses ve Video streamleri taşınabilmektedir. TCP üzerinden bir portla sunucu ile çift yönlü haberleşme sağlar. Çift yönlü kavramı şunu alatır: Flash Player sunucuya bilgi gönderebildiği gibi , sunucu da ,"her hangi bir talep olmasa da", Flash Player'a istediği anda bilgi gönderebilir. Bu anlamda HTTP protokölü tek yönlüdür. HTTP protoklünde sunucudan bilgi almak için istemcinin (browser yada flash player) istekte bulunması gereklidir. RTMP bağlatısının davranışarını denetlemek için kullanılan sunucuya ait (Red5, FMS yada WebOrb) API kullanılarak bir uygulama geliştirilir ve bağlantı bu uygulamaya yapılır.

RTMP Protoklünün bazı türevleri de vardır.

RTMPT : Mesajlaşmanın güvenlik duvarına takılması durumunda tünel üzerinden açık bir portla (çoğunlukla 80 numaralı port (HTTP portu) tercih edilir. Çünkü hep açıktır. ) yürütülmesi için kullanılır.

RTMPS : Mesajlaşmanın başında bir şifre ile kimlik doğrulaması yapıp sonra mesajlaşmaya müsade edilen protokoldür.

RTMPE : Mesajlaşmanın güvenli bir kanaldan kriptolu olarak yapılmasını sağlar.

RTMFP : RTMP protokolünün diğer tüm türevlerinde haberleşme Flash Player ile Sunucu arasında yapılır. Eğer iki Flash Player haberleşecekse, bu sunucu üzerinden gerçekleştirilir. Bu da sunucunun kaynaklarını tüketir, haberleşmeyi yavaşlatır ve aşırı bant genişliği kullanımını sağlar.
RTMFP ise bu türden haberleşmeler için geliştirilmiştir. P2P haberleşmeye müsade eder. Bu protokolün nasıl çalıştığını daha detaylı olarak daha sonraki yazılarımda anlatacağım.


RTMP protoklü ile bilikte kullanılan yardımcı sınıflar:

NetConnection: NetConnection sunucu ile bağlantıyı kurmak için kullanılır. Bu esnada sunucuya çeşitli parametreler gönderilebilir. Bağlantının başarısız olması, sonradan kopması, sunucu tarafından reddedilmesi yada başarılı olması gibi durumlarda bir olay tetiklenecektir. Ayrıca sunucu üzerinde bağlantı kurulan uygulamaya ait "public" özniteliğindeki foksiyonları da çağırabilir. Bu çağrıdan geriye dönen değerleri alabilir.

RemoteObject : Sunucu üzerinde bağlantı kurulan uygulama aslında bir class dosyasıdır. RemoteObject ise o class'tan türetilmiş bir nesne gibi düşünebilir. Uzaktaki class üzerinde "public" öznitelikli fonksiyonları sanki kendi uygulamamızdaymış gibi çağırabiliriz.

SharedObject: Çoğu geliştirici SharedObject sınıfını local olarak kullanmış yada kullanmaktadır. Oysaki RTMP protoklü ile SharedObject sınıfı sunucu üzerinde kullanılabilmektedir. SharedObject 'i RTMP ile uzak sunucuda kullanmak multiplayer oyunlar için çok işlevseldir. Çünkü bu haliyle SharedObject'e ait bir kopya bir oyuncuda, bir kopya sunucuda, bir koya ise diğer oyuncu/oyunuclar da tutulmaktadır. Herhangibirisi (sunucu yada istemci) SharedObject üzerinde bir değişiklik yaptığında bu durum anında diğer taraflara da iletilmekte ve bir olay tetiklenmektedir.

Bu sınıflar dışında daha pek çok sınıf vardır. Daha ileriki yazılarımda örneklendirilmiş olarak hepsini anlatmaya çalışacağım.

No comments:

Post a Comment

Followers