Flash CS4 Kaynakları

Diğer Flash Player ve AIR örneklerine bağlanma



LocalConnection sınıfı, bir HTML konteynerindeki veya gömülü ya da bağımsız oynatıcıdaki bir SWF dosyası gibi farklı Flash Player ve AIR örnekleri arasında iletişim kurmanıza olanak sağlar. Bu da, bir web tarayıcısında çalışan veya masaüstü uygulamalarında gömülü olan SWF dosyaları gibi Flash Player ve AIR örnekleri arasında veri paylaşabilen çok yönlü uygulamalar oluşturmanıza olanak verir.

LocalConnection sınıfı

LocalConnection sınıfı, fscommand() yöntemini veya JavaScript uygulamasını kullanmadan diğer SWF dosyalarına talimatlar gönderebilen SWF dosyaları geliştirmenize olanak sağlar. LocalConnection nesneleri yalnızca aynı istemci bilgisayarında çalışan SWF dosyaları arasında iletişim kurabilir ancak bunlar farklı uygulamalarda çalışabilir. Örneğin, yerel bilgileri barındıran projektör ile tarayıcı tabanlı SWF uzaktan bağlanarak, bir tarayıcıda çalışan SWF dosyası ile bir projektörde çalışan SWF dosyası bilgi paylaşabilir. (Projektör, bağımsız bir uygulama olarak çalışabilecek formatta kaydedilmiş bir SWF dosyasıdır—başka bir deyişle, projektör çalıştırılabilir dosyanın içinde gömülü olduğundan Flash Player uygulamasının yüklenmesini gerektirmez.)

Farklı ActionScript sürümlerini kullanan SWF'ler arasında iletişim kurmak için LocalConnection nesneleri kullanılabilir:

  • ActionScript 3.0 LocalConnection nesneleri, ActionScript 1.0 veya 2.0'da oluşturulmuş LocalConnection nesneleriyle iletişim kurabilir.

  • ActionScript 1.0 veya 2.0 LocalConnection nesneleri, ActionScript 3.0'da oluşturulmuş LocalConnection nesneleriyle iletişim kurabilir.

Flash Player, farklı sürümlerdeki LocalConnection nesneleri arasındaki bu iletişim otomatik olarak işler.

LocalConnection nesnesini kullanmanın en basit yolu, yalnızca aynı etki alanında bulunan LocalConnection nesneleri arasında iletişime izin verilmesidir. Bu şekilde, güvenlik sorunlarıyla ilgili endişe duymanız gerekmez. Ancak etki alanları arasında iletişime izin vermeniz gerekiyorsa, güvenlik önlemlerini uygulamanın birçok yolu vardır. Daha fazla bilgi için, ActionScript 3.0 Dil ve Bileşenler Başvurusu'ndaki LocalConnection sınıf listelerinde bulunan send() yönteminin connectionName parametresi ile allowDomain() ve domain girişleriyle ilgili açıklamalara bakın.

Tek bir SWF dosyası içinde veri alıp vermek için LocalConnection nesneleri kullanılabilir ancak Adobe bunu önermez. Bunun yerine paylaşılan nesneleri kullanmanız gerekir.

LocalConnection nesnelerinize geri çağrı yöntemleri eklemenin üç yolu vardır:

  • LocalConnection sınıfını alt sınıfa ayırın ve yöntemler ekleyin.

  • LocalConnection.client özelliğini, yöntemleri uygulayan bir nesneye ayarlayın.

  • LocalConnection öğesini genişleten ve dinamik olarak yöntemler ekleyen bir dinamik sınıf oluşturun.

Geri çağrı yöntemleri eklemenin birinci yolu, LocalConnection sınıfının genişletilmesidir. Yöntemleri LocalConnection örneğine dinamik olarak eklemek yerine, özel sınıf içinde tanımlarsınız. Aşağıdaki kodda bu yaklaşık gösterilmektedir:

package 
{ 
    import flash.net.LocalConnection; 
    public class CustomLocalConnection extends LocalConnection 
    { 
        public function CustomLocalConnection(connectionName:String) 
        { 
            try 
            { 
                connect(connectionName); 
            } 
            catch (error:ArgumentError) 
            { 
                // server already created/connected 
            } 
        } 
        public function onMethod(timeString:String):void 
        { 
            trace("onMethod called at: " + timeString); 
        } 
    } 
}

DynamicLocalConnection sınıfının yeni bir örneğini oluşturmak için, şu kodu kullanabilirsiniz:

var serverLC:CustomLocalConnection; 
serverLC = new CustomLocalConnection("serverName");

Geri çağrı yöntemleri eklemenin ikinci yolu, LocalConnection.client özelliğinin kullanılmasıdır. Bu işlem kapsamında, aşağıdaki kodun gösterdiği gibi, özel bir sınıf oluşturulur ve client özelliğine yeni bir örnek atanır:

var lc:LocalConnection = new LocalConnection(); 
lc.client = new CustomClient();

LocalConnection.client özelliği, çağrılması gereken nesne geri çağrı yöntemlerini belirtir. Önceki kodda client özelliği, özel sınıfın yeni bir örneğine (CustomClient) ayarlanmıştı. client özelliğinin varsayılan değeri, geçerli LocalConnection örneğidir. Aynı yöntem kümesine sahip olan ancak farklı şekilde hareket eden iki veri işleyiciniz varsa (örneğin, bir penceredeki düğmenin ikinci bir penceredeki görünümü değiştirdiği bir uygulamada), client özelliğini kullanabilirsiniz.

CustomClient sınıfını oluşturmak için şu kodu kullanabilirsiniz:

package 
{ 
    public class CustomClient extends Object 
    { 
        public function onMethod(timeString:String):void 
        { 
            trace("onMethod called at: " + timeString); 
        } 
    } 
}

Geri çağrı yöntemleri eklemenin üçüncü yolu olarak dinamik bir sınıf oluşturulması ve yöntemlerin dinamik olarak eklenmesi, aşağıdaki kodun gösterdiği gibi, önceki ActionScript sürümlerinde LocalConnection sınıfının kullanılmasına çok benzer:

import flash.net.LocalConnection; 
dynamic class DynamicLocalConnection extends LocalConnection {}

Geri çağrı yöntemleri, aşağıdaki kod kullanılarak bu sınıfa dinamik olarak eklenebilir:

var connection:DynamicLocalConnection = new DynamicLocalConnection(); 
connection.onMethod = this.onMethod; 
// Add your code here. 
public function onMethod(timeString:String):void 
{ 
    trace("onMethod called at: " + timeString); 
}

Kod çok taşınabilir bir öğe olmadığından, geri çağrı yöntemleri eklemenin bir önceki yolu önerilmez. Ayrıca, dinamik özelliklere erişim, mühürlenmiş özelliklere erişimden çok daha yavaş olduğundan, bu yerel bağlantı oluşturma yönteminin kullanılması performansla ilgili sorunlara yol açabilir.

İki Flash Player örneği arasında mesaj gönderme

Flash Player ve Adobe AIR uygulamalarının farklı örnekleri arasında iletişim kurmak için LocalConnection sınıfını kullanırsınız. Örneğin, bir web sayfasında birden çok Flash Player örneğiniz olabilir veya bir Flash Player örneğinin, bir açılır penceredeki Flash Player örneğinden veriler almasını sağlayabilirsiniz.

Aşağıdaki kod, bir sunucu olarak hareket eden ve diğer Flash Player örneklerinden gelen çağrıları kabul eden yerel bir bağlantı nesnesini tanımlar:

package 
{ 
    import flash.net.LocalConnection; 
    import flash.display.Sprite; 
    public class ServerLC extends Sprite 
    { 
        public function ServerLC() 
        { 
            var lc:LocalConnection = new LocalConnection(); 
            lc.client = new CustomClient1(); 
            try 
            { 
                lc.connect("conn1"); 
            } 
            catch (error:Error) 
            { 
                trace("error:: already connected"); 
            } 
        } 
    } 
}

Bu kod ilk olarak lc adında bir LocalConnection nesnesi oluşturur ve client özelliğini özel bir sınıfa (CustomClient1) ayarlar. Başka bir Flash Player örneği bu yerel bağlantı örneğinde bir yöntemi çağırdığında, Flash Player uygulaması CustomClient1 sınıfında o yöntemi arar.

Bir Flash Player örneği bu SWF dosyasına her bağlandığında ve belirtilen yerel bağlantı için herhangi bir yöntemi çağırmayı denediğinde, istek, client özelliği tarafından belirtilen ve CustomClient1 sınıfı olarak ayarlanan sınıfa gönderilir:

package 
{ 
    import flash.events.*; 
    import flash.system.fscommand; 
    import flash.utils.Timer; 
    public class CustomClient1 extends Object 
    { 
        public function doMessage(value:String = ""):void 
        { 
            trace(value); 
        } 
        public function doQuit():void 
        { 
            trace("quitting in 5 seconds"); 
            this.close(); 
            var quitTimer:Timer = new Timer(5000, 1); 
            quitTimer.addEventListener(TimerEvent.TIMER, closeHandler); 
        } 
        public function closeHandler(event:TimerEvent):void 
        { 
            fscommand("quit"); 
        } 
    } 
}

LocalConnection sunucusu oluşturmak için, LocalConnection.connect() yöntemini çağırın ve benzersiz bir bağlantı adı sağlayın. Belirtilen adla önceden bağlantınız varsa bir ArgumentError hatası oluşturulur ve bu hata, nesne zaten bağlanmış olduğundan bağlantı girişiminin başarısız olduğunu belirtir.

Aşağıdaki kod parçası, conn1 adında yeni bir soket bağlantısının nasıl oluşturulduğunu gösterir:

try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}

İkincil bir SWF dosyasından birincil SWF dosyasına bağlanılması için, gönderen LocalConnection nesnesinde yeni bir LocalConnection nesnesi oluşturmanız ve sonra bağlantının adı ve çalıştırılacak yöntemin adı ile LocalConnection.send() yöntemini çağırmanız gerekir. Örneğin, önceden oluşturduğunuz LocalConnection nesnesine bağlanmak için şu kodu kullanırsınız:

sendingConnection.send("conn1", "doQuit");

Bu kod, conn1 bağlantı adıyla varolan bir LocalConnection nesnesine bağlanır ve uzak SWF dosyasında doQuit() yöntemini çağırır. Uzak SWF dosyasına parametre göndermek istiyorsanız, aşağıdaki kod parçasının gösterdiği gibi, send() yönteminde yöntem adından sonra ek argümanlar belirtirsiniz:

sendingConnection.send("conn1", "doMessage", "Hello world");

Farklı etki alanlarındaki SWF belgelerine bağlanma

Yalnızca belirli etki alanlarından iletişime olanak sağlamak için, LocalConnection sınıfının allowDomain() veya allowInsecureDomain() yöntemini çağırırsınız ve bu LocalConnection nesnesine erişmesine izin verilen bir ya da daha fazla etki alanlarının bir listesini iletirsiniz.

Önceki ActionScript sürümlerinde LocalConnection.allowDomain() ve LocalConnection.allowInsecureDomain() öğeleri, geliştiriciler tarafından uygulanması ve bir Boolean değeri döndürmesi gereken geri çağrı yöntemleriydi. ActionScript 3.0'da LocalConnection.allowDomain() ve LocalConnection.allowInsecureDomain() öğesinin ikisi de, geliştiricilerin Security.allowDomain() ve Security.allowInsecureDomain() gibi çağırarak, izin verilecek bir veya daha fazla etki alanını iletebildiği yerleşik yöntemlerdir.

LocalConnection.allowDomain() ve LocalConnection.allowInsecureDomain() yöntemlerine iletebileceğiniz iki özel değer vardır: * ve localhost. Yıldız değeri (*), tüm etki alanlarından erişilmesine izin verir. localhost dizesi, yerel olarak yüklenmiş SWF dosyalarından SWF dosyasına çağrılara olanak verir.

Flash Player 8, yerel SWF dosyaları üzerinde güvenlik kısıtlamaları getirmiştir. İnternet'e erişmesine izin verilen bir SWF dosyası aynı zamanda yerel dosya sistemine erişime sahip olamaz. localhost öğesini belirtirseniz, herhangi bir yerel SWF dosyası SWF dosyasına erişebilir. LocalConnection.send() yöntemi, çağıran kodun erişiminin olmadığı bir güvenlik sanal alanındaki SWF dosyasıyla iletişim kurmayı denerse, bir securityError olayı(SecurityErrorEvent.SECURITY_ERROR) gönderilir. Bu hata için geçici bir çözüm üretmek için, alıcının LocalConnection.allowDomain() yönteminde çağıranın etki alanını belirtebilirsiniz.

Yalnızca aynı etki alanındaki SWF dosyaları arasında iletişim uygularsanız, alt çizgiyle (_) başlamayan ve bir etki alanı adı belirtmeyen bir connectionName parametresi (örneğin, myDomain:connectionName) belirtebilirsiniz. LocalConnection.connect(connectionName) komutunda aynı dizeyi kullanın.

Farklı etki alanları arasında iletişim uygularsanız, alt çizgiyle başlayan bir connectionName parametresi belirtirsiniz. Alt çizgi belirtilmesi, alan LocalConnection nesnesini içeren SWF dosyasını etki alanları arasında daha okunabilir hale getirir. İki olası durum şu şekildedir:

  • connectionName dizesi alt çizgiyle başlamazsa, Flash Player uygulaması üst etki alanı adı ve iki nokta içeren bir önek ekler (örneğin, myDomain:connectionName). Bu, bağlantınızın diğer etki alanlarındaki aynı ada sahip bağlantılarla çakışmamasını sağlasa da, gönderen LocalConnection nesnelerinin bu üst etki alanını belirtmesi gerekir (örneğin, myDomain:connectionName). Alan LocalConnection nesnesini içeren SWF dosyasını başka bir etki alanına taşırsanız, Flash Player, yeni üst etki alanını yansıtmak için öneki değiştirir (örneğin, anotherDomain:connectionName). Tüm gönderen LocalConnection nesnelerinin yeni üst etki alanını işaret etmek üzere elle düzenlenmesi gerekir.

  • connectionName dizesi alt çizgiyle başlarsa (örneğin, _connectionName), Flash Player dizeye önek eklemez. Başka bir deyişle, alan ve gönderen LocalConnection nesneleri connectionName için aynı dizeleri kullanır. Alan nesne, herhangi bir etki alanındaki bağlantıların kabul edileceğini belirtmek için LocalConnection.allowDomain() öğesini kullanırsa, gönderen LocalConnection nesnelerinden herhangi birini değiştirmeden, alan LocalConnection nesnesini içeren SWF dosyasını başka bir etki alanına taşıyabilirsiniz.