Soketler

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Soket, iki bilgisayar işlemi arasında kurulan bir ağ bağlantısı türüdür. Tipik olarak, işlemler aynı İnternet İletişim Kuralı (IP) ağına bağlı iki farklı bilgisayarda çalışır. Ancak, bağlı işlemler özel “yerel ana bilgisayar” IP adresi kullanarak aynı bilgisayarda çalışıyor olabilir.

Adobe Flash Player istemci tarafı Taşıma Kontrolü İletişim Kuralı (TCP) soketlerini destekler. Bir Flash Player uygulaması, soket sunucusu olarak hareket eden başka bir işleme bağlanabilirken, diğer işlemlerden gelen bağlantı taleplerini kabul edemez. Diğer bir deyişle, bir Flash Player uygulaması TCP sunucusuna bağlanabilir, ancak bir tane gibi hareket edemez.

Flash Player API’si XMLSocket sınıfını da içerir. XMLSocket sınıfı, o iletişim kuralını anlayan bir sunucuyla XML mesajları alışverişi yapmaya imkan veren Flash Player’a özel bir iletişim kuralı kullanır. XMLSocket sınıfı ActionScript 1’de ortaya koyulmuştur ve hala geriye dönük uyumluluk sağlaması için destekleniyor. Genel olarak Socket sınıfı, Flash XMLSockets ile iletişim kurmak için özellikle oluşturulmuş bir sunucuya bağlanmadığınız sürece yeni uygulamalar için kullanılmalıdır.

Adobe AIR, soket tabanlı ağ programlaması için ilave sınıflar ekler. AIR uygulamaları ServerSocket sınıfıyla birlikte TCP soket sunucuları gibi hareket edebilir ve SecureSocket sınıfıyla birlikte SSL ya da TLS güvenliği gerektiren soket sunuculara bağlanabilir. AIR uygulamaları DatagramSocket sınıfıyla birlikte Evrensel Datagram İletişim Kuralı (UDP) mesajlarını da gönderip alabilir.

TCP soketleri

İletim Denetimi Protokolü (TCP), kalıcı bir ağ bağlantısı üzerinden mesaj alışverişi yapılmasını sağlar. TCP, gönderilen mesajların doğru sırada alınacağını garanti eder (büyük ağ sorunlarını engeller). TCP bağlantıları bir “istemci” ve bir “sunucu” gerektirir. Flash Player istemci soketleri oluşturabilir. Adobe AIR ayrıca sunucu soketleri oluşturabilir.

Aşağıdaki ActionScript API'leri TCP bağlantıları sağlar:

  • Soket — bir istemci uygulamasının sunucuya bağlanmasına izin verir. Socket sınıfı gelen bağlantıları dinleyemez.

  • SecureSocket (AIR) — bir istemci uygulamasının güvenilir bir sunucuya bağlanmasına ve şifreli bağlantılara girmesine izin verir.

  • ServerSocket (AIR) — bir uygulamanın gelen bağlantıları dinlemesine ve sunucu olarak davranmasına izin verir.

  • XMLSocket — bir istemci uygulamasının XMLSocket sunucusuna bağlanmasına izin verir.

İkili istemci soketleri

İkili soket bağlantısı, istemci ve sunucunun özellikle XML paketleri değişmesini gerektirmemesi dışında, XML soketine benzer. Bunun yerine, bağlantı verileri ikili bilgi halinde aktarabilir. Bu da, arasında posta sunucuları (POP3, SMTP ve IMAP) ve haber sunucularının da (NNTP) yer aldığı çok çeşitli hizmetlere bağlanmanızı sağlar.

Socket sınıfı

Socket sınıfı soket bağlantıları yapabilmenizi ve ham ikili veriler okuyup yazabilmenizi sağlar. Socket sınıfı, ikili protokoller kullanan sunucularla birlikte çalışıldığında yararlıdır. İkili soket bağlantıları kullanarak, POP3, SMTP, IMAP ve NNTP gibi farklı İnternet protokolleriyle etkileşime izin veren bir kod yazabilirsiniz. Bu etkileşim, uygulamalarınızın posta ve haber sunucularına bağlanmasını sağlar.

Flash Player, doğrudan bir sunucunun ikili protokolünü kullanarak o sunucuyla arabirim oluşturabilir. Bazı sunucular big-endian bayt sırasını, bazıları little-endian bayt sırasını kullanır. “Ağ bayt sırası” big-endian olduğundan, İnternet'teki çoğu sunucu big-endian bayt sırasını kullanır. Intel® x86 mimarisi tarafından kullanıldığından, little-endian bayt sırası sık kullanılır. Veri gönderen ve alan sunucunun bayt sırasıyla eşleşen endian bayt sırasını kullanmalısınız. IDataInput ve IDataOutput arabirimleri tarafından gerçekleştirilen tüm işlemler ve bu arabirimleri uygulayan sınıflar (ByteArray, Socket ve URLStream) varsayılan olarak big-endian biçiminde, başka bir deyişle, en önemli bayt önce olacak şekilde kodlanır. Bu varsayılan bayt sırası Java ve resmi ağ bayt sırası ile eşleşecek şekilde seçilir. Kullanılan big-endian veya little-endian bayt sırasını değiştirmek için, endian özelliğini Endian.BIG_ENDIAN veya Endian.LITTLE_ENDIAN olarak ayarlayabilirsiniz.

Soket sınıfı, (flash.utils paketinde yer alan) IDataInput ve DataOutput arabirimleri tarafından tanımlanan tüm yöntemleri üstlenir. Soketten yazmak ve okuma yapmak için bu yöntemler kullanılmalıdır.

Daha fazla bilgi için bkz.:

Güvenli istemci soketleri (AIR)

SecureSocket sınıfını, Güvenli Soket Katmanı sürüm 4 (Secure Sockets Layer - SSLv4) veya Taşıma Katmanı Güvenliği sürüm 1 (Transport Layer Security - TLSv1) kullanan soket sürücülerine bağlanmak için kullanabilirsiniz. Güvenli bir soketin üç avantajı vardır: sunucu onaylama, veri bütünlüğü ve mesaj gizliliği. Çalışma zamanı, kullanıcının güvenilir deposunda bir sunucu sertifikasını ve kökle veya ara sertifika yetkisiyle olan ilişkisini kullanarak bir sunucuyu yetkilendirir. Çalışma zamanı, veri bütünlüğü ve mesaj gizliliği sağlamak için SSL ve TLS protokol uygulamaları tarafından kullanılan şifreleme algoritmalarını temel alır.

SecureSocket nesnesini kullanarak sunucuya bağlandığınızda çalışma zamanı sertifika güven deposu kullanarak sunucu sertifikasını doğrular. Windows ve Mac üzerinde, işletim sistemi bir güven deposu sağlar. Linux'ta uygulamasının çalışma zamanı, kendi güven deposunu sağlar.

Sunucu sertifikası geçerli veya güvenilir değilse çalışma zamanı ioError olayı gönderir. Doğrulamanın başarısız olmasının nedenini kontrol etmek için SecureSocket nesnesinin serverCertificateStatus özelliğini kontrol edin. Geçerli ve güvenilir sertifikası olmayan bir sunucuya bağlanmak için gereken bir koşul yoktur.

CertificateStatus sınıfı, olası doğrulama sonuçlarını gösteren dize kalıp deyimlerini tanımlar:

  • Süresi dolmuş - sertifikanın geçerlilik süresi dolmuş.

  • Geçersiz - bir sertifikanın geçersiz olduğunu gösteren birkaç neden var. Örneğin, sertifika değiştirilmiş, bozulmuş olabilir veya yanlış türde bir sertifika olabilir.

  • Geçersiz zincir - sunucunun sertifika zincirinde bir veya birden fazla sertifika geçersiz.

  • Ana uyumsuzluk — Ana bilgisayarın adı ve sertifikanın ortak adı eşleşmiyor. Bir başka deyişle, sunucu yanlış sertifikayı kullanıyor.

  • İptal edilmiş — sunulan sertifika yetkisi, sertifikayı iptal etti.

  • Güvenilir — sertifika geçerli ve doğrulanmış. Bir SecureSocket nesnesi yalnızca geçerli, güvenilir bir sertifika kullanan bir sunucuya bağlanabilir.

  • Bilinmiyor - SecureSocket nesnesi sertifikayı henüz doğrulamamış. serverCertificateStatus özelliğini, connect() öğesini çağırmanızdan önce ve connect veya bir ioError olayı gönderilmeden önce bu değer konumuna sahiptir.

  • Güvenilmeyen imzacılar — sertifika, istemci bilgisayarın güven deposundaki güvenilir köke "zincir" bağlamaz.

SecureSocket nesnesi ile bağlanmak, güvenilir bir iletişim kuralı kullanan ve geçerli, güvenilir bir sertifikası bulunan bir sunucu gerektirir. Diğer açılardan SecureSocket nesnesi kullanma Soket nesnesi kullanmayla aynıdır.

SecureSocket nesnesi tüm platformlarda desteklenmez. SecureSocket sınıfının isSupported özelliğini, çalışma zamanının SecureSocket nesnesinin geçerli istemci bilgisayarda kullanılmasını destekleyip desteklemediğini sınamak amacıyla kullanın.

Daha fazla bilgi için bkz.:

TCP socket örneği: Telnet istemcisi oluşturma

Telnet örneği, uzak bir sunucuya bağlanıp Socket sınıfını kullanarak veri iletilmesi tekniklerini göstermektedir. Örnekte şu teknikler gösterilmektedir:

  • Socket sınıfını kullanarak özel bir telnet istemcisi oluşturma

  • ByteArray nesnesini kullanarak uzak sunucuya metin gönderme

  • Uzak sunucudan alınan verileri işleme

Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr . Telnet uygulama dosyaları, Samples/Telnet klasöründe bulunabilir. Uygulama aşağıdaki dosyaları içerir:

File

Açıklama

TelnetSocket.fla

veya

TelnetSocket.mxml

Flex (MXML) veya Flash (FLA) için kullanıcı arabirimi içeren ana uygulama dosyası.

TelnetSocket.as

Kullanıcı arabirimi mantığını sağlayan belge sınıfı (yalnızca Flash).

com/example/programmingas3/Telnet/Telnet.as

Uygulama için, uzak sunucuya bağlanma, veri gönderme, alma ve görüntüleme gibi Telnet istemcisi işlevlerini sağlar.

Telnet soket uygulamasına genel bakış

Ana TelnetSocket.mxml dosyası, uygulamanın tamamı için kullanıcı arabirimi (UI) oluşturmaktan sorumludur.

Bu dosya, belirtilen sunucuya bağlanmak için kullanıcı arabirimine ek olarak iki yöntemi tanımlar: login() ve sendCommand() .

Aşağıdaki kod, ana uygulama dosyasında ActionScript'i listeler:

import com.example.programmingas3.socket.Telnet; 
 
private var telnetClient:Telnet; 
private function connect():void 
{ 
    telnetClient = new Telnet(serverName.text, int(portNumber.text), output); 
    console.title = "Connecting to " + serverName.text + ":" + portNumber.text; 
    console.enabled = true; 
} 
private function sendCommand():void 
{ 
    var ba:ByteArray = new ByteArray(); 
    ba.writeMultiByte(command.text + "\n", "UTF-8"); 
    telnetClient.writeBytesToSocket(ba); 
    command.text = ""; 
}

Birinci kod satırı, özel com.example.programmingas.socket paketinden Telnet sınıfını içe aktarır. İkinci kod satırı, daha sonra connect() yöntemi tarafından başlatılacak olan telnetClient adında bir Telnet sınıfı örneğini bildirir. Ardından, connect() yöntemi bildirilir ve önceden bildirilmiş telnetClient değişkenini başlatır. Bu yöntem, kullanıcı tanımlı telnet sunucu adını, telnet sunucu bağlantı noktasını ve görüntüleme listesindeki TextArea bileşeninin bir başvurusunu iletir, bu başvuru, soket sunucusundan gelen metin yanıtlarını görüntülemek için kullanılır. connect() yönteminin son iki satırı, Panel için title özelliğini ayarlar ve Panel bileşenini etkinleştirir, böylece kullanıcının uzak sunucuya veri göndermesine olanak sağlanır. Kullanıcının komutlarını bir ByteArray nesnesi olarak uzak sunucuya göndermek için, ana uygulama dosyasındaki son yöntem olan sendCommand() kullanılır.

Telnet sınıfına genel bakış

Telnet sınıfı, uzak Telnet sunucusuna bağlanılmasından ve veri gönderilmesinden/alınmasından sorumludur.

Telnet sınıfı şu özel değişkenleri bildirir:

private var serverURL:String; 
private var portNumber:int; 
private var socket:Socket; 
private var ta:TextArea; 
private var state:int = 0;

Birinci değişken olan serverURL , bağlanılacak kullanıcı tanımlı sunucu adresini içerir.

İkinci değişken olan portNumber , Telnet sunucusunun geçerli olarak üzerinde çalıştığı bağlantı noktası numarasıdır. Varsayılan olarak Telnet hizmeti, bağlantı noktası 23'te çalışır.

Üçüncü değişken olan socket , serverURL ve portNumber değişkenleri tarafından tanımlanmış sunucuya bağlanmayı deneyen bir Socket örneğidir.

Dördüncü değişken olan ta , Sahne Alanı'ndaki bir TextArea bileşeni örneğine başvurudur. Bu bileşen, uzak Telnet sunucusundan gelen yanıtları veya olası hata mesajlarını görüntülemek için kullanılır.

Son değişken olan state , Telnet istemcinizin hangi seçenekleri desteklediğini belirlemek için kullanılan sayısal bir değişkendir.

Daha önce gördüğünüz gibi, Telnet sınıfının yapıcı işlevi, ana uygulama dosyasındaki connect() yöntemi tarafından çağrılır.

Telnet yapıcısı üç parametre alır: server , port ve output . server ve port parametreleri, sunucu adını ve Telnet sunucusunun çalıştığı bağlantı noktası numarasını belirtir. Son parametre olan output , sunucu çıktısını kullanıcılara görüntüleneceğini Sahne alanındaki Textarea bileşen örneği için bir başvurudur.

public function Telnet(server:String, port:int, output:TextArea) 
{ 
    serverURL = server; 
    portNumber = port; 
    ta = output; 
    socket = new Socket(); 
    socket.addEventListener(Event.CONNECT, connectHandler); 
    socket.addEventListener(Event.CLOSE, closeHandler); 
    socket.addEventListener(ErrorEvent.ERROR, errorHandler); 
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
    socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); 
    Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml"); 
    try 
    { 
        msg("Trying to connect to " + serverURL + ":" + portNumber + "\n"); 
        socket.connect(serverURL, portNumber); 
    } 
    catch (error:Error) 
    { 
        msg(error.message + "\n"); 
        socket.close(); 
    } 
}
Sokete veri yazma

Verileri bir soket bağlantısına yazmak için Soket sınıfındaki yazma yöntemlerinden herhangi birini çağırın. Bu yöntemler arasında writeBoolean() , writeByte() , writeBytes() , writeDouble() ve diğer yöntemler yer alır. Daha sonra verileri, flush() yöntemini kullanarak çıktı arabelleğinde boşaltın. Telnet sunucusunda, bayt dizisini parametre olarak alıp çıktı arabelleğine gönderen writeBytes() yöntemi kullanılarak soket bağlantısına veriler yazılır. writeBytesToSocket() yöntemi şöyledir:

public function writeBytesToSocket(ba:ByteArray):void 
{ 
    socket.writeBytes(ba); 
    socket.flush(); 
}

Bu yöntem, ana uygulama dosyasının sendCommand() yöntemi tarafından çağrılır.

Soket sunucusundan mesajları görüntüleme

Soket sunucusundan her mesaj alındığında veya bir olay gerçekleştiğinde, özel msg() yöntemi çağrılır. Bu yöntem, Sahne Alanı'nda TextArea öğesine bir dize ekler ve TextArea bileşeninin alta gitmesini sağlayan özel bir setScroll() yöntemini çağırır. msg() yöntemi şöyledir:

private function msg(value:String):void 
{ 
    ta.text += value; 
    setScroll(); 
}

TextArea bileşeninin içeriklerini otomatik olarak kaydırmadıysanız, kullanıcıların sunucudan gelen en son yanıtı görmek için metin alanında kaydırma çubuklarını elle sürüklemesi gerekir.

TextArea bileşenini kaydırma

setScroll() yöntemi, kullanıcının döndürülen metnin son satırını görebilmesi için TextArea bileşeninin içeriklerini dikey olarak kaydıran tek bir ActionScript satırı içerir. Aşağıdaki kod parçası, setScroll() yöntemini gösterir:

public function setScroll():void 
{ 
    ta.verticalScrollPosition = ta.maxVerticalScrollPosition; 
}

Bu yöntem, geçerli olarak görüntülenen karakterlerin en üst satırının satır numarası olan verticalScrollPosition özelliğini ayarlar ve bunu maxVerticalScrollPosition özelliğinin değerine ayarlar.

XML soketleri

Bir XML soketi, belirgin bir şekilde kapatılana kadar açık kalan uzak sunucuya bağlantı kurmanıza izin verir. Sunucu ve istemci arasında, XML gibi dize verisi alış verişi yapabilirsiniz. XML soket sunucusu kullanmanın sağladığı faydalardan biri, istemcinin açık bir şekilde veri istemek zorunda kalmamasıdır. Sunucu istek beklemeden veri gönderebilir ve bağlı durumda olan her istemciye veri gönderebilir.

Flash Player'da ve uygulama sanal alanı dışındaki Adobe AIR içeriğinde, XML soketi bağlantıları hedef sunucuda bir soket ilke dosyası olmasını gerektirir. Daha fazla bilgi için, bkz. Web sitesi denetimleri (ilke dosyaları) ve Soketlere bağlanma .

XMLSocket sınıfı güvenlik duvarları arasından otomatik olarak tünel oluşturamaz, çünkü Real-Time Messaging Protocol'ün (RTMP) aksine XMLSocket, HTTP tüneli özelliğine sahip değildir. HTTP tüneli kullanmanız gerekiyorsa, bunun yerine Flash Remoting veya Flash Media Server (RTMP'yi destekler) kullanabilirsiniz.

Şu kısıtlamalar Flash Player veya uygulama güvenlik sanal alanı dışındaki AIR uygulamasındaki içeriğin bir XMLSocket nesnesini sunucuya bağlanmak için nasıl ve nerede kullanabileceğini belirtir:

  • Uygulama güvenlik sanal alanının dışındaki içerik için XMLSocket.connect() yöntemi yalnızca 1024'ten büyük veya 1024'e eşit TCP bağlantı noktası numaralarına bağlanabilir. Bu kısıtlamanın bir sonucu, XMLSocket nesnesiyle iletişim kuran sunucu arka plan programlarının da 1024'ten büyük veya 1024'e eşit bağlantı noktası numaralarına atanmak zorunda olmasıdır. 1024'ün altındaki bağlantı noktası numaraları genellikle FTP (21), Telnet (23), SMTP (25), HTTP (80) ve POP3 (110) gibi sistem servisleri tarafından kullanılır, bu yüzden XMLSocket nesneleri güvenlik nedenleriyle bu bağlantı noktalarından engellenir. Bağlantı noktası numara kısıtlaması, bu kaynaklara uygun olmayan biçimlerde erişilmesi ve kaynakların kötüye kullanılması olasılığını azaltır.

  • Uygulama güvenlik sanal alanının dışındaki içerik için, XMLSocket.connect() yöntemi yalnızca içeriğin yer aldığı etki alanının aynısında bulunan bilgisayarlara bağlanabilir. (Bu kısıtlama URLLoader.load() için güvenlik kurallarının aynısıdır.) İçeriğin yer aldığı etki alanından farklı bir etki alanında çalışan sunucu arka plan programına bağlanmak için, sunucuda belirli etki alanlarından erişime izin veren bir etki alanları arası politika dosyası oluşturabilirsiniz. Etki alanları arası ilke dosyaları hakkında ayrıntılar için bkz. AIR güvenliği .

Not: XMLSocket nesnesiyle iletişim kurmak üzere bir sunucu kurmak zor olabilir. Uygulamanız gerçek zamanlı etkileşim gerektirmiyorsa, XMLSocket sınıfı yerine URLLoader sınıfını kullanın.

Soket bağlantısı üzerinden bir sunucuya XML aktarmak ve bu sunucudan XML almak için XMLSocket sınıfının XMLSocket.connect() ve XMLSocket.send() yöntemlerini kullanabilirsiniz. XMLSocket.connect() yöntemi, web sunucusu bağlantı noktasıyla bir soket bağlantısı oluşturur. XMLSocket.send() yöntemi, XML nesnesini soket bağlantısında belirtilen sunucuya iletir.

XMLSocket.connect() yöntemini çağırdığınızda, uygulama sunucuya bir TCP/IP bağlantısı açar ve aşağıdaki durumlardan biri oluşana kadar bağlantıyı açık tutar:

  • XMLSocket sınıfı XMLSocket.close() yönteminin çağrılması.

  • XMLSocket sınıfına başvuru bulunmaması.

  • Flash Player uygulamasından çıkılır.

  • Bağlantının kopması (örneğin, modem bağlantısının kesilmesi).

XMLSocket sınıfıyla bir sunucuya bağlanma

Bir soket bağlantısı oluşturmak için, soket bağlantı isteğini bekleyecek ve Flash Player veya AIR uygulamasına yanıt gönderecek bir sunucu tarafı uygulaması oluşturmalısınız. Bu tür bir sunucu tarafı uygulaması AIR'de veya Java, Python veya Perl gibi başka bir programlama dilinde yazılabilir. XMLSocket sınıfını kullanmak için sunucu bilgisayarı, XMLSocket sınıfı tarafından kullanılan basit protokolü anlayan bir arka plan programı çalıştırmalıdır:

  • XML mesajları, tam çift yönlü bir TCP/IP akış soket bağlantısı üzerinden gönderilir.

  • Her XML mesajı, sıfır (0) baytıyla sonlanan tam bir XML belgesidir.

  • Tek bir XMLSocket bağlantısı üzerinden sınırsız sayıda XML mesajı gönderilebilir ve alınabilir.

Java XML soket sunucusu oluşturma ve bağlanma

Aşağıdaki kod, gelen bağlantıları kabul eden ve komut istemi penceresinde alınan mesajları görüntüleyen, Java'da yazılmış basit bir XMLSocket sunucusunu gösterir. Sunucunuzu komut satırından başlatırken farklı bir bağlantı noktası numarası belirtebiliyor olsanız da, yeni bir sunucu varsayılan olarak yerel bilgisayarınızın 8080 bağlantı noktasında oluşturulur.

Yeni bir metin belgesi oluşturun ve şu kodu ekleyin:

import java.io.*; 
import java.net.*; 
 
class SimpleServer 
{ 
    private static SimpleServer server; 
    ServerSocket socket; 
    Socket incoming; 
    BufferedReader readerIn; 
    PrintStream printOut; 
 
    public static void main(String[] args) 
    { 
        int port = 8080; 
 
        try 
        { 
            port = Integer.parseInt(args[0]); 
        } 
        catch (ArrayIndexOutOfBoundsException e) 
        { 
            // Catch exception and keep going. 
        } 
 
        server = new SimpleServer(port); 
    } 
 
    private SimpleServer(int port) 
    { 
        System.out.println(">> Starting SimpleServer"); 
        try 
        { 
            socket = new ServerSocket(port); 
            incoming = socket.accept(); 
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); 
            printOut = new PrintStream(incoming.getOutputStream()); 
            printOut.println("Enter EXIT to exit.\r"); 
            out("Enter EXIT to exit.\r"); 
            boolean done = false; 
            while (!done) 
            { 
                String str = readerIn.readLine(); 
                if (str == null) 
                { 
                    done = true; 
                } 
                else 
                { 
                    out("Echo: " + str + "\r"); 
                    if(str.trim().equals("EXIT")) 
                    { 
                        done = true; 
                    } 
                } 
                incoming.close(); 
            } 
        } 
        catch (Exception e) 
        { 
            System.out.println(e); 
        } 
    } 
 
    private void out(String str) 
    { 
        printOut.println(str); 
        System.out.println(str); 
    } 
}

Belgeyi sabit diskinize SimpleServer.java olarak kaydedin ve SimpleServer.class adlı bir Java sınıfı dosyası oluşturan Java derleyicisini kullanarak derleyin.

Bir komut istemini açarak ve java SimpleServer yazarak XMLSocket sunucusunu başlatabilirsiniz. SimpleServer.class dosyası yerel bilgisayarınızda veya ağda herhangi bir yerde konumlandırılabilir; web sunucunuzun kök dizinine yerleştirilmesi gerekmez.

Dosyalar Java sınıf yolu içinde bulunmadığından sunucuyu başlatamıyorsanız, sunucuyu şununla başlatmayı deneyin: java -classpath . SimpleServer .

Uygulamanızdan XMLSocket öğesine bağlanmak için, aşağıdaki gibi, yeni bir XMLSocket sınıfı örneği oluşturmanız ve bir ana bilgisayar adı ve bağlantı noktası numarası iletirken XMLSocket.connect() yöntemini çağırmanız gerekir:

var xmlsock:XMLSocket = new XMLSocket(); 
xmlsock.connect("127.0.0.1", 8080);

Sunucudan her veri aldığınızda, data olayı ( flash.events.DataEvent.DATA ) gönderilir:

xmlsock.addEventListener(DataEvent.DATA, onData); 
private function onData(event:DataEvent):void 
{ 
    trace("[" + event.type + "] " + event.data); 
}

XMLSocket sunucusuna veri göndermek için, XMLSocket.send() yöntemini kullanıp bir XML nesnesi veya dizesi iletirsiniz. Flash Player, sağlanan parametreyi bir String nesnesine dönüştürür ve içeriği bir sıfır (0) baytın takip ettiği XMLSocket sunucusuna gönderir:

xmlsock.send(xmlFormattedData);

XMLSocket.send() yöntemi, verilerin başarıyla aktarılıp aktarılmadığını gösteren bir değer döndürmez. Veri gönderilmeye çalışılırken bir hata oluştuysa, bir IOError hatası verilir.

XML soket sunucusuna gönderdiğiniz her mesajın yeni satır ( \n ) karakteriyle sonlandırılması gerekir.

Daha fazla bilgi için bkz. XMLSocket

Sunucu soketleri

Diğer işlemlerin İletim Denetimi Protokolü (TCP) soketi kullanarak uygulamanıza bağlanmalarını sağlamak için ServerSocket sınıfını kullanın. Bağlanma işlemi yerel bir bilgisayarda veya ağa bağlanmış başka bir bilgisayarda çalıştırılabilir. Bir ServerSocket nesnesi bir bağlantı talebi aldığında bir connect olayı gönderir. ServerSocketConnectEvent olayı, Soket nesnesi içeren bir olayla gönderildi. Bu Soket nesnesini sonradan diğer işlemlerle iletişim kurmak için kullanabilirsiniz.

Gelen soket bağlantılarını dinlemek için:

  1. Bir ServerSocket nesnesi oluşturun ve yerel bir bağlantı noktasına bağlayın

  2. connect olayı için olay dinleyicileri ekleyin.

  3. listen() yöntemini çağırın

  4. Gelen her bağlantı için Soket nesnesi sağlayan connect olayını yanıtlayın.

ServerSocket nesnesi, siz close() yöntemini çağırıncaya kadar ek bağlantıları dinlemeye devam eder.

Aşağıdaki kod örneğinde soket sunucu uygulamasının nasıl oluşturulduğu gösterilmektedir. Örnek, bağlantı noktası 8087'de gelen bağlantıları dinler. Bir bağlantı alındığında örnek tarafından bir mesaj gönderilir ("Bağlandı" dizesi). istemci soketine Bu nedenle sunucu, istemciden geri gelen tüm iletileri ikinci kez gösterir.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.events.ProgressEvent; 
    import flash.events.ServerSocketConnectEvent; 
    import flash.net.ServerSocket; 
    import flash.net.Socket; 
     
    public class ServerSocketExample extends Sprite 
    { 
        private var serverSocket:ServerSocket; 
        private var clientSockets:Array = new Array(); 
 
        public function ServerSocketExample() 
        { 
            try 
            { 
                // Create the server socket 
                serverSocket = new ServerSocket(); 
                 
                // Add the event listener 
                serverSocket.addEventListener( Event.CONNECT, connectHandler ); 
                serverSocket.addEventListener( Event.CLOSE, onClose ); 
                 
                // Bind to local port 8087 
                serverSocket.bind( 8087, "127.0.0.1" ); 
                 
                // Listen for connections 
                serverSocket.listen(); 
                trace( "Listening on " + serverSocket.localPort ); 
 
            } 
            catch(e:SecurityError) 
            { 
                trace(e); 
            } 
        } 
 
        public function connectHandler(event:ServerSocketConnectEvent):void 
        { 
            //The socket is provided by the event object 
            var socket:Socket = event.socket as Socket; 
            clientSockets.push( socket ); 
             
            socket.addEventListener( ProgressEvent.SOCKET_DATA, socketDataHandler); 
            socket.addEventListener( Event.CLOSE, onClientClose ); 
            socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError ); 
             
            //Send a connect message 
            socket.writeUTFBytes("Connected."); 
            socket.flush(); 
             
            trace( "Sending connect message" ); 
        } 
         
        public function socketDataHandler(event:ProgressEvent):void 
        { 
            var socket:Socket = event.target as Socket 
                 
            //Read the message from the socket 
            var message:String = socket.readUTFBytes( socket.bytesAvailable ); 
            trace( "Received: " + message); 
 
            // Echo the received message back to the sender 
            message = "Echo -- " + message; 
            socket.writeUTFBytes( message ); 
            socket.flush(); 
            trace( "Sending: " + message ); 
        } 
         
        private function onClientClose( event:Event ):void 
        { 
            trace( "Connection to client closed." ); 
            //Should also remove from clientSockets array... 
        } 
 
        private function onIOError( errorEvent:IOErrorEvent ):void 
        { 
            trace( "IOError: " + errorEvent.text ); 
        } 
 
        private function onClose( event:Event ):void 
        { 
            trace( "Server socket closed by OS." ); 
        } 
}}

Daha fazla bilgi için bkz.:

UDP soketleri (AIR)

Evrensel Veri Protokolü (UDP), ağ bağlantısı üzerinden mesaj alışverişi yapılmasını sağlar. UDP, mesajların sırayla veya hepsinin dağıtıldığını garanti etmez. UDP ile, işletim sisteminin ağ kodu mesajları sıralamada (marshaling), izlemede ve onaylamada genellikle daha az zaman harcar. Bu nedenle UDP mesajları genellikle hedef uygulamaya TCP mesajlarınınkinden daha kısa bir gecikmeyle ulaşır.

UDP soket iletişimi, bir oyunda konum güncellemeleri veya sesli sohbet uygulamasındaki ses paketleri gibi gerçek zamanlı bilgi göndermek zorunda olduğunuz zamanlarda yararlıdır. Bu tür uygulamalarda bazı veri kayıpları kabul edilebilirdir. İletim gecikme süresinin düşük olması, iletilerin varmalarının garantili olmasından daha önemlidir. Tüm diğer amaçlar açısından TCP soketleri daha iyi bir tercihtir.

AIR uygulamanız DatagramSocket ve DatagramSocketDataEvent sınıflarıyla UDP mesajları gönderir ve alır. Bir UDP mesajı göndermek veya almak için:

  1. Bir DatagramSocket nesnesi oluşturun

  2. data olayı için olay dinleyici ekleyin

  3. Soketi, bind() yöntemini kullanarak yerel bir IP adresine ve bağlantı noktasına bağlayın.

  4. Mesajları, send() yöntemini çağırarak, IP adresinde ve hedef bilgisayarın bağlantı noktasına geçirerek gönderin.

  5. data olayına cevap vererek iletileri alın. DatagramSocketDataEvent nesnesi, mesaj verileri içeren bir ByteArray nesnesinin bulunduğu bir olay için göndermiştir.

Aşağıdaki kod örneği, bir uygulamanın nasıl UDP mesajları gönderdiğini ve aldığını göstermektedir. Örnek, hedef bilgisayara "Merhaba" dizesinin yer aldığı tek mesaj gönderir. Alınan herhangi bir mesajın içeriğini de izler.

package 
{ 
import flash.display.Sprite; 
import flash.events.DatagramSocketDataEvent; 
import flash.events.Event; 
import flash.net.DatagramSocket; 
import flash.utils.ByteArray; 
 
public class DatagramSocketExample extends Sprite 
{ 
    private var datagramSocket:DatagramSocket; 
     
    //The IP and port for this computer 
    private var localIP:String = "192.168.0.1"; 
    private var localPort:int = 55555; 
     
    //The IP and port for the target computer 
    private var targetIP:String = "192.168.0.2"; 
    private var targetPort:int = 55555; 
     
    public function DatagramSocketExample() 
    { 
        //Create the socket 
        datagramSocket = new DatagramSocket(); 
        datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived ); 
         
        //Bind the socket to the local network interface and port 
        datagramSocket.bind( localPort, localIP ); 
         
        //Listen for incoming datagrams 
        datagramSocket.receive(); 
         
        //Create a message in a ByteArray 
        var data:ByteArray = new ByteArray(); 
        data.writeUTFBytes("Hello."); 
         
        //Send the datagram message 
        datagramSocket.send( data, 0, 0, targetIP, targetPort); 
    } 
     
    private function dataReceived( event:DatagramSocketDataEvent ):void 
    { 
        //Read the data from the datagram 
        trace("Received from " + event.srcAddress + ":" + event.srcPort + "> " + 
            event.data.readUTFBytes( event.data.bytesAvailable ) ); 
    } 
}}

UDP (user data protocol: kullanıcı veri protokolü) soketlerini kullanırken aşağıdaki noktaları göz önünde bulundurmayı unutmayın.

  • Tek bir veri paketi, gönderen ve alıcı arasındaki ağ arabiriminin veya herhangi bir ağ düğümlerinin en küçük maksimum iletim biriminden (MTU) daha büyük olamaz. send() yöntemine geçirilen ByteArray nesnesindeki bütün veriler tek bir paket olarak iletildi. (TCP'de büyük mesajlar ayrı paketlere bölünür).

  • Gönderen ve hedef arasında hiçbir anlaşma yoktur. Hedef mevcut değilse veya belirtilen bağlantı noktasında aktif bir dinleyici yoksa iletiler hata vermeden atılır.

  • connect() yöntemini kullandığınızda diğer kaynaklardan gelen mesajlar göz ardı edilir. Bir UDP bağlantısı yalnızca uygun paket filtrelemesi sağlar. Bu, hedef adreste veya bağlantı noktasında geçerli olması gereken bir dinleme işlemi olmadığı anlamına gelmez.

  • UDP trafiği bir ağı sıkıştırmaz. Ağ yöneticileri, ağ tıkanıklığı olduğunda hizmet kalitesi kontrollerini uygulama ihtiyacı duyabilirler. (TCP'nin, ağ sıkışıklığının etkisini azaltmak için yerleşik trafik kontrolü vardır.

Daha fazla bilgi için bkz.:

IPv6 adresleri

Flash Player 9.0.115.0 ve sonrası, IPv6'yı (Internet Protokolü sürüm 6) destekler. IPv6, 128 bit adresleri destekleyen bir Internet Protokolü sürümüdür (32 bit adresleri destekleyen önceki IPv4 protokolündeki bir geliştirme). Ağ arabirimleriniz üzerinde IPv6'yı etkinleştirmeniz gerekebilir. Daha fazla bilgi için verileri barındıran işletim sisteminin Yardım bölümüne bakın.

IPv6, barındıran sistem üzerinde destekleniyorsa, köşeli ayraç ([]) içindeki URL'lerde şu şekilde sayısal IPv6 değişmez adreslerini belirtebilirsiniz:

[2001:db8:ccc3:ffff:0:444d:555e:666f]

Flash Player, şu kurallara göre değişmez IPv6 değerlerini döndürür:

  • Flash Player, IPv6 adresleri için uzun dize formunu döndürür.

  • IP değeri çift iki nokta kısaltma içermez.

  • Onaltılık basamaklar yalnızca küçük harf olur.

  • IPv6 adresler, köşeli ayraç ([]) içine alınır.

  • Her adres dörtlüsü, başındaki sıfır atılmış şekilde 0 - 4 onaltılık basamak olarak verilir.

  • Aşağıdaki istisnalar listesinde belirtilenler dışında, tümü sıfır olan bir adres dörtlüsü tek bir sıfır olarak (çift iki nokta olarak değil) verilir.

Flash Player'ın döndürdüğü IPv6 değerleri şu istisnaları içerir:

  • Belirtilmemiş bir IPv6 adresi (tümü sıfır) [::] olarak verilir.

  • Geri döngü veya yerel ana bilgisayar IPv6 adresi, [::1] olarak verilir.

  • IPv4 eşleşmiş (IPv6'ya dönüştürülmüş) adresleri, [::ffff:a.b.c.d] olarak verilir, burada a.b.c.d, tipik bir IPv4 noktalı ondalık değeridir.

  • IPv4 uyumlu adresler, [::a.b.c.d] olarak verilir, burada a.b.c.d, tipik bir IPv4 noktalı ondalık değeridir.