네트워킹 및 통신의 기초
Flash Player 9 이상, Adobe AIR 1.0 이상
Flash Player 또는 AIR에서 응용 프로그램을 제작할 때 응용 프로그램 외부의 리소스에 액세스해야 하는 경우가 많습니다. 예를 들어 인터넷 웹 서버에 이미지 요청을 보내고 이미지 데이터를 받을 수 있습니다. 또는 응용 프로그램 서버에 대한 소켓 연결을 통해 직렬화된 객체를 주고 받을 수 있습니다. Flash Player 및 AIR API는 응용 프로그램이 이러한 교환에 참여할 수 있도록 하는 여러 클래스를 제공합니다. 이러한 API는 UDP, TCP, HTTP, RTMP, RTMFP 등의 프로토콜에 대한 IP 기반 네트워킹을 지원합니다.
네트워크를 통해 데이터를 주고받기 위해 사용할 수 있는 클래스는 다음과 같습니다.
클래스
|
지원되는 데이터 형식
|
프로토콜
|
설명
|
Loader
|
SWF, PNG, JPEG, GIF
|
HTTP, HTTPS
|
지원되는 데이터 형식을 로드하고 해당 데이터를 표시 객체로 변환합니다.
자세한 내용은
표시 내용을 동적으로 로드
를 참조하십시오.
|
URLLoader
|
모두(텍스트, XML, 이진 등)
|
HTTP, HTTPS
|
임의의 데이터 형식을 로드합니다. 응용 프로그램에서 데이터 해석을 담당합니다.
자세한 내용은
URLLoader 클래스 사용
를 참조하십시오.
|
FileReference
|
모두
|
HTTP
|
파일을 업로드 및 다운로드합니다.
자세한 내용은
FileReference 클래스 사용
을 참조하십시오.
|
NetConnection
|
비디오, 오디오, AMF(ActionScript Message Format)
|
HTTP, HTTPS, RTMP, RTMFP
|
비디오, 오디오 및 원격 객체 스트림에 연결합니다.
자세한 내용은
비디오를 사용한 작업
을 참조하십시오.
|
Sound
|
오디오
|
HTTP
|
지원되는 오디오 형식을 로드하고 재생합니다.
자세한 내용은
외부 사운드 파일 로드
를 참조하십시오.
|
XMLSocket
|
XML
|
TCP
|
XMLSocket 서버와 XML 메시지를 교환합니다.
자세한 내용은
XML 소켓
을 참조하십시오.
|
Socket
|
모두
|
TCP
|
TCP 소켓 서버에 연결합니다.
자세한 내용은
이진 클라이언트 소켓
을 참조하십시오.
|
SecureSocket
(AIR)
|
모두
|
TCP(SSLv3 또는 TLSv1 사용)
|
SSL 또는 TLS 보안이 필요한 TCP 소켓 서버에 연결합니다.
자세한 내용은
보안 클라이언트 소켓(AIR)
을 참조하십시오.
|
ServerSocket
(AIR)
|
모두
|
TCP
|
들어오는 TCP 소켓 연결에 대한 서버 역할을 합니다.
자세한 내용은
서버 소켓
을 참조하십시오.
|
DatagramSocket
(AIR)
|
모두
|
UDP
|
UDP 패킷을 보내고 받습니다.
자세한 내용은
UDP 소켓(AIR)
을 참조하십시오.
|
웹 응용 프로그램을 만들 때 사용자의 응용 프로그램 상태에 대한 영구 정보를 저장하는 것이 유용한 경우가 많습니다. HTML 페이지 및 응용 프로그램은 이를 위해 일반적으로 쿠키를 사용합니다. Flash Player에서는 이를 위해 SharedObject 클래스를 사용할 수 있습니다. 자세한 내용은
공유 객체
를 참조하십시오. AIR 응용 프로그램에서 SharedObject 클래스를 사용할 수 있지만 데이터를 일반 파일에 저장할 때 적용되는 제한이 적습니다.
Flash Player 또는 AIR 응용 프로그램이 동일한 컴퓨터에 있는 다른 Flash Player 또는 AIR 응용 프로그램과 통신해야 하는 경우 LocalConnection 클래스를 사용할 수 있습니다. 예를 들어 동일한 웹 페이지에 있는 두 개(또는 그 이상)의 SWF가 서로 통신할 수 있습니다. 마찬가지로 웹 페이지에서 실행되는 SWF는 AIR 응용 프로그램과 통신할 수 있습니다. 자세한 내용은
다른 Flash Player 및 AIR 인스턴스와 통신
을 참조하십시오.
로컬 컴퓨터에 있는 SWF 이외의 프로세스와 통신해야 하는 경우 AIR 2에 추가된 NativeProcess클래스를 사용할 수 있습니다. NativeProcess 클래스는 AIR 응용 프로그램이 다른 응용 프로그램을 실행하고 함께 통신할 수 있도록 합니다. 자세한 내용은
AIR의 기본 프로세스와 통신
을 참조하십시오.
AIR 응용 프로그램이 실행되는 컴퓨터의 네트워크 환경에 대한 정보가 필요한 경우 다음과 같은 클래스를 사용할 수 있습니다.
-
NetworkInfo - 컴퓨터의 IP 주소와 같은 사용 가능한 네트워크 인터페이스에 대한 정보를 제공합니다. 자세한 내용은
네트워크 인터페이스
를 참조하십시오.
-
DNSResolver - DNS 레코드를 조회할 수 있도록 합니다. 자세한 내용은
DNS(Domain Name System) 레코드
를 참조하십시오.
-
ServiceMonitor - 서버의 가용성 여부를 모니터링할 수 있도록 합니다. 자세한 내용은
서비스 모니터링
을 참조하십시오.
-
URLMonitor - 특정 URL에서 리소스의 가용성을 모니터링할 수 있도록 합니다. 자세한 내용은
HTTP 모니터링
을 참조하십시오.
-
SocketMonitor 및 SecureSocketMonitor - 소켓에서 리소스의 가용성을 모니터링할 수 있도록 합니다. 자세한 내용은
소켓 모니터링
을 참조하십시오.
중요한 개념 및 용어
네트워킹 및 통신 코드를 프로그래밍할 때 사용되는 중요한 용어가 아래 참조 목록에 정리되어 있습니다.
-
외부 데이터
-
응용 프로그램 외부의 일부 양식에 저장되는 데이터로 필요할 때 응용 프로그램에 로드됩니다. 이 데이터는 직접 로드한 파일에 저장하거나, 서버에서 실행되는 스크립트나 프로그램을 호출하여 가져온 데이터베이스나 다른 양식에 저장할 수 있습니다.
-
URL 인코딩된 변수
-
URL 인코딩 형식을 사용하면 여러 가지 변수(변수 이름과 값의 쌍)를 하나의 텍스트 문자열로 나타낼 수 있습니다. 개별 변수는 name=value 형식으로 작성되고, 각 변수(각 이름-값 쌍)는 앰퍼샌드 문자로 구분됩니다(예: variable1=value1&variable2=value2). 이러한 방법으로 무제한의 변수를 하나의 메시지로 보낼 수 있습니다.
-
MIME 유형
-
인터넷 통신에서 지정된 파일 유형을 확인하는 데 사용되는 표준 코드입니다. 모든 지정된 파일 유형에는 해당 유형을 식별하는 데 사용되는 특정 코드가 있습니다. 컴퓨터(예: 웹 서버 또는 사용자의 Flash Player 또는 AIR 인스턴스)에서 파일 또는 메시지를 보낼 때는 보내는 파일 유형을 지정합니다.
-
HTTP
-
Hypertext Transfer Protocol의 약어로 인터넷을 통해 전송되는 웹 페이지 및 다양한 유형의 내용을 전달하기 위한 표준 포맷입니다.
-
요청 메서드
-
AIR 응용 프로그램이나 웹 브라우저 같은 응용 프로그램에서 메시지(HTTP 요청이라고 함)를 웹 서버에 보낼 때 전송되는 모든 데이터는 GET과 POST의 두 가지 요청 메서드 중 한 가지 방식을 사용하여 요청에 포함될 수 있습니다. 서버 끝에서 요청을 받는 프로그램은 데이터를 찾기 위해 요청의 적절한 부분을 조회해야 하므로, 응용 프로그램에서 데이터를 보내는 데 사용되는 요청 메서드는 서버에서 해당 데이터를 읽을 때 사용되는 요청 메서드와 일치해야 합니다.
-
소켓 연결
-
두 컴퓨터 간의 통신을 위한 영구 연결입니다.
-
업로드
-
파일을 다른 컴퓨터로 보냅니다.
-
다운로드
-
다른 컴퓨터에서 파일을 가져옵니다.
네트워크 인터페이스
NetworkInfo 객체를 사용하면 응용 프로그램에서 사용할 수 있는 하드웨어 및 소프트웨어 네트워크 인터페이스를 검색할 수 있습니다. NetworkInfo 객체는
단일
객체이므로 만들 필요가 없습니다. 대신 정적 클래스 속성인
networkInfo
를 사용하여 단일 NetworkInfo 객체에 액세스하십시오. NetworkInfo 객체는 또한 사용 가능한 인터페이스 중 하나가 변경되는 경우에도
networkChange
이벤트를 전달합니다.
NetworkInterface 객체 목록을 가져오려면
findInterfaces()
메서드를 호출합니다. 목록에 있는 각 NetworkInterface 객체는 사용 가능한 인터페이스 중 하나를 설명합니다. NetworkInterface 객체는 IP 주소, 하드웨어 주소, 최대 전송 단위 및 인터페이스의 활성 여부와 같은 정보를 제공합니다.
다음 코드 예제에서는 클라이언트 컴퓨터의 각 인터페이스에 대한 NetworkInterface 속성을 추적합니다.
package {
import flash.display.Sprite;
import flash.net.InterfaceAddress;
import flash.net.NetworkInfo;
import flash.net.NetworkInterface;
public class NetworkInformationExample extends Sprite
{
public function NetworkInformationExample()
{
var networkInfo:NetworkInfo = NetworkInfo.networkInfo;
var interfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces();
if( interfaces != null )
{
trace( "Interface count: " + interfaces.length );
for each ( var interfaceObj:NetworkInterface in interfaces )
{
trace( "\nname: " + interfaceObj.name );
trace( "display name: " + interfaceObj.displayName );
trace( "mtu: " + interfaceObj.mtu );
trace( "active?: " + interfaceObj.active );
trace( "parent interface: " + interfaceObj.parent );
trace( "hardware address: " + interfaceObj.hardwareAddress );
if( interfaceObj.subInterfaces != null )
{
trace( "# subinterfaces: " + interfaceObj.subInterfaces.length );
}
trace("# addresses: " + interfaceObj.addresses.length );
for each ( var address:InterfaceAddress in interfaceObj.addresses )
{
trace( " type: " + address.ipVersion );
trace( " address: " + address.address );
trace( " broadcast: " + address.broadcast );
trace( " prefix length: " + address.prefixLength );
}
}
}
}
}
}
자세한 내용은 다음 항목을 참조하십시오.
네트워크 연결 변경
AIR 응용 프로그램은 네트워크 연결이 확실하지 않고 변경되는 환경에서 실행될 수 있습니다. 응용 프로그램에서 온라인 리소스에 대한 연결을 관리하는 것을 지원하기 위해 Adobe AIR은 네트워크 연결을 사용할 수 있게 되거나 사용할 수 없게 될 때마다 네트워크 변경 이벤트를 보냅니다. NetworkInfo 객체 및 응용 프로그램의 NativeApplication 객체는 모두
networkChange
이벤트를 전달합니다. 이 이벤트에 응답하려면 리스너를 추가합니다.
NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
그런 다음 이벤트 핸들러 함수를 정의합니다.
function onNetworkChange(event:Event)
{
//Check resource availability
}
networkChange
이벤트는 모든 네트워크 활동의 변경을 나타내지는 않으며 개별 네트워크 연결이 변경된 것만 나타냅니다. AIR에서는 네트워크 변경의 의미를 해석하려고 하지 않습니다. 네트워크에 연결된 컴퓨터에는 많은 실제 연결과 가상 연결이 있을 수 있으므로 연결이 손실되어도 리소스가 반드시 손실되지는 않습니다. 반면에 새로운 연결은 향상된 리소스 가용성을 보장하지 않습니다. 새 연결이 이전에 사용할 수 있던 리소스에 대한 액세스를 차단하는 경우도 있습니다(예: VPN에 연결하는 경우).
일반적으로 응용 프로그램에서 원격 리소스에 연결할 수 있는지 확인하는 유일한 방법은 연결을 시도하는 것입니다. 서비스 모니터링 프레임워크는 지정된 호스트에 대한 네트워크 연결이 변경되는 경우 적용할 수 있는 이벤트 기반 응답 방법을 제공합니다.
참고:
서비스 모니터링 프레임워크에서는 서버가 요청에 적절하게 응답하는지 여부를 감지합니다. 검사가 성공하더라도 연결이 완전히 보장되는 것은 아닙니다. 확장 가능한 웹 서비스에서는 흔히 캐싱 및 로드 균형 조정 도구를 사용하여 트래픽을 웹 서버의 클러스터에 리디렉션합니다. 이 상황에서 서비스 공급자는 네트워크 연결의 부분적 진단만 제공합니다.
서비스 모니터링
AIR 프레임워크와는 별도의 서비스 모니터링 프레임워크가 aircore.swc 파일에 있습니다. 이 프레임워크를 사용하려면 aircore.swc 파일이 제작 과정에 포함되어야 합니다.
Adobe® Flash® Builder에서는 이 라이브러리를 자동으로 포함합니다.
ServiceMonitor 클래스는 네트워크 서비스를 모니터링하기 위한 프레임워크를 구현하고 서비스 모니터에 대한 기본 기능을 제공합니다. 기본적으로 ServiceMonitor 클래스의 인스턴스는 네트워크 연결과 관련된 이벤트를 전달합니다. ServiceMonitor 객체는 인스턴스가 만들어질 때 그리고 런타임에서 네트워크 변경이 감지될 때 이러한 이벤트를 전달합니다. 또한 ServiceMonitor 인스턴스의
pollInterval
속성을 설정하여 일반적인 네트워크 연결 이벤트와 관계없이 지정된 간격(밀리초)으로 연결을 확인할 수 있습니다. ServiceMonitor 객체는
start()
메서드가 호출될 때까지 네트워크 연결을 확인하지 않습니다.
ServiceMonitor 클래스의 하위 클래스인 URLMonitor 클래스는 지정된 URLRequest의 HTTP 연결의 변경을 감지합니다.
역시 ServiceMonitor 클래스의 하위 클래스인 SocketMonitor 클래스는 지정된 포트에서 지정된 호스트에 대한 연결의 변경을 감지합니다.
참고:
AIR 2 이전 버전에서는 서비스 모니터링 프레임워크가 servicemonitor.swc 라이브러리에서 제작되었습니다. 이 라이브러리는 현재 사용되지 않습니다. 대신 aircore.swc 라이브러리를 사용합니다.
Flash CS4 및 CS5 Professional
Adobe® Flash® CS4 또는 CS5 Professional에서 이러한 클래스를 사용하려면 다음 작업을 수행합니다.
-
[파일] > [제작 설정] 명령을 선택합니다.
-
ActionScript 3.0에 대한 [설정] 버튼을 클릭합니다. [라이브러리 경로]를 선택합니다.
-
[SWC 파일 찾아보기] 버튼을 클릭하고 Flash Professional 설치 폴더에서 AIK 폴더를 찾습니다.
-
이 폴더에서 /frameworks/libs/air/aircore.swc(AIR 2의 경우) 또는 /frameworks/libs/air/servicemonitor.swc(AIR 1.5의 경우)를 찾습니다.
-
[확인] 버튼을 클릭합니다.
-
다음 import 문을 ActionScript 3.0 코드에 추가합니다.
import air.net.*;
Flash CS3 Professional
Adobe® Flash® CS3 Professional에서 이러한 클래스를 사용하려면 ServiceMonitorShim 구성 요소를 [구성 요소] 패널에서 [라이브러리]로 드래그하고 다음
import
문을 ActionScript 3.0 코드에 추가합니다.
import air.net.*;
HTTP 모니터링
URLMonitor 클래스는 포트 80(HTTP 통신을 위한 일반적인 포트)에서 지정된 주소에 대한 HTTP 요청을 수행할 수 있는지 확인합니다. 다음 코드에서는 URLMonitor 클래스의 인스턴스를 사용하여 Adobe 웹 사이트에 대한 연결 변경을 감지합니다.
import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
var monitor:URLMonitor;
monitor = new URLMonitor(new URLRequest('http://www.example.com'));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + monitor.available);
}
소켓 모니터링
AIR 응용 프로그램에서는 푸쉬 모델 연결을 위해 소켓 연결도 사용할 수 있습니다. 일반적으로 방화벽과 네트워크 라우터는 보안상의 이유로 권한이 없는 포트에서 네트워크 통신을 제한합니다. 이 때문에 개발자는 사용자가 소켓 연결을 설정할 수 없는 경우를 고려해야 합니다.
다음 코드에서는 SocketMonitor 클래스의 인스턴스를 사용하여 소켓 연결에 대한 연결 변경을 감지합니다. 모니터링되는 포트는 IRC에 대한 일반 포트인 6667입니다.
import air.net.ServiceMonitor;
import flash.events.StatusEvent;
socketMonitor = new SocketMonitor('www.example.com',6667);
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
socketMonitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + socketMonitor.available);
}
소켓 서버에 보안 연결이 필요한 경우 SocketMonitor 대신에 SecureSocketMonitor 클래스를 사용할 수 있습니다.
DNS(Domain Name System) 레코드
DNSResolver 클래스를 사용하여 DNS 리소스 레코드를 조회할 수 있습니다. DNS 리소스 레코드는 도메인 이름의 IP 주소 및 IP 주소의 도메인 이름과 같은 정보를 제공합니다. 다음과 같은 DNS 리소스 레코드의 유형을 조회할 수 있습니다.
-
ARecord - 호스트의 IPv4 주소입니다.
-
AAAARecord - 호스트의 IPv6 주소입니다.
-
MXRecord - 호스트의 메일 교환 레코드입니다.
-
PTRRecord - IP 주소의 호스트 이름입니다.
-
SRVRecord - 서비스에 대한 서비스 레코드입니다.
레코드를 조회하려면 쿼리 문자열과 레코드 유형을 나타내는 클래스 객체를 DNSResolver 객체의
lookup()
메서드에 전달합니다. 사용할 쿼리 문자열은 레코드 유형에 따라 달라집니다.
레코드 클래스
|
쿼리 문자열
|
예제 쿼리 문자열
|
ARecord
|
호스트 이름
|
“example.com”
|
AAAARecord
|
호스트 이름
|
“example.com”
|
MXRecord
|
호스트 이름
|
“example.com”
|
PTRRecord
|
IP 주소
|
“208.77.188.166”
|
SRVRecord
|
Service 식별자: _service._protocol.host
|
“_sip._tcp.example.com”
|
다음 코드 예제에서는 “example.com” 호스트의 IP 주소를 조회합니다.
package
{
import flash.display.Sprite;
import flash.events.DNSResolverEvent;
import flash.events.ErrorEvent;
import flash.net.dns.ARecord;
import flash.net.dns.DNSResolver;
public class DNSResolverExample extends Sprite
{
public function DNSResolverExample()
{
var resolver:DNSResolver = new DNSResolver();
resolver.addEventListener( DNSResolverEvent.LOOKUP, lookupComplete );
resolver.addEventListener( ErrorEvent.ERROR, lookupError );
resolver.lookup( "example.com.", ARecord );
}
private function lookupComplete( event:DNSResolverEvent ):void
{
trace( "Query string: " + event.host );
trace( "Record count: " + event.resourceRecords.length );
for each( var record:* in event.resourceRecords )
{
if( record is ARecord ) trace( record.address );
}
}
private function lookupError( error:ErrorEvent ):void
{
trace("Error: " + error.text );
}
}
}
자세한 내용은 다음 항목을 참조하십시오.
|
|
|
|
|