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:
-
Bir ServerSocket nesnesi oluşturun ve yerel bir bağlantı noktasına bağlayın
-
connect
olayı için olay dinleyicileri ekleyin.
-
listen()
yöntemini çağırın
-
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:
-
Bir DatagramSocket nesnesi oluşturun
-
data
olayı için olay dinleyici ekleyin
-
Soketi,
bind()
yöntemini kullanarak yerel bir IP adresine ve bağlantı noktasına bağlayın.
-
Mesajları,
send()
yöntemini çağırarak, IP adresinde ve hedef bilgisayarın bağlantı noktasına geçirerek gönderin.
-
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.
|
|
|
|
|