다른 Flash Player 및 AIR 인스턴스와 통신

Flash Player 9 이상, Adobe AIR 1.0 이상

LocalConnection 클래스를 사용하면 Adobe® AIR® 응용 프로그램 간은 물론 브라우저에서 실행되는 SWF 내용 간에도 통신할 수 있습니다. 또한 브라우저에서 실행하는 AIR 응용 프로그램 및 SWF 내용 간에도 통신할 수 있습니다. LocalConnection 클래스를 사용하면 Flash Player 및 AIR 인스턴스 사이에 데이터 공유가 가능한 다양한 용도의 응용 프로그램을 작성할 수 있습니다.

LocalConnection 클래스

LocalConnection 클래스를 사용하면 fscommand() 메서드나 JavaScript를 사용하지 않고 다른 SWF 파일에 명령을 보낼 수 있는 SWF 파일을 개발할 수 있습니다. LocalConnection 객체는 동일한 클라이언트 시스템에서 실행되는 SWF 파일 간에만 통신할 수 있습니다. 하지만 서로 다른 응용 프로그램에서 실행되는 경우는 가능합니다. 예를 들어 프로젝터에서 로컬 정보를 유지하고 원격으로 브라우저 기반 SWF 파일에 연결한 상태로 파일 브라우저에서 실행되는 SWF 파일과 프로젝터에서 실행되는 SWF 파일이 정보를 공유할 수 있습니다. 프로젝터는 독립 실행형 응용 프로그램으로 실행할 수 있는 형식으로 저장된 SWF 파일로, 실행 파일 내에 Flash Player가 포함되어 있으므로 Flash Player를 설치할 필요가 없습니다.

LocalConnection 객체는 다음과 같이 여러 ActionScript 버전을 사용하여 SWF 간에 통신하는 데 사용할 수 있습니다.

  • ActionScript 3.0 LocalConnection 객체는 ActionScript 1.0 또는 2.0으로 만들어진 LocalConnection 객체와 통신할 수 있습니다.

  • ActionScript 1.0 또는 2.0 LocalConnection 객체는 ActionScript 3.0으로 만들어진 LocalConnection 객체와 통신할 수 있습니다.

Flash Player는 다른 버전의 LocalConnection 객체 간의 통신을 자동으로 처리합니다.

LocalConnection 객체를 가장 간단하게 사용할 수 있는 방법은 동일한 도메인 또는 동일한 AIR 응용 프로그램에 위치한 LocalConnection 객체 간 통신만 허용하는 것입니다. 그러면 보안 문제에 대해 걱정하지 않아도 됩니다. 서로 다른 도메인 사이에서 통신해야 하는 경우, 보안 문제를 해결할 수 있는 몇 가지 방법이 있습니다. 자세한 내용은 Adobe Flash Platform용 ActionScript 3.0 참조 설명서 에 나열된 LocalConnection 클래스의 allowDomain() domain 항목과 send() 메서드의 connectionName 매개 변수에 대한 설명을 참조하십시오.

LocalConnection 객체를 사용하여 하나의 SWF 파일에 포함된 데이터를 송수신할 수 있으나 좋은 방법은 아닙니다. 대신 공유 객체를 사용하십시오.

LocalConnection 객체에 콜백 메서드를 추가하는 방법은 다음 세 가지입니다.

  • LocalConnection 클래스를 하위 클래스로 사용하고 메서드 추가

  • LocalConnection.client 속성을 이 메서드를 구현하는 객체로 설정

  • LocalConnection을 확장하는 동적 클래스를 만들고 동적으로 메서드 추가

콜백 메서드를 추가하는 첫 번째 방법은 LocalConnection 클래스를 확장하는 것입니다. 동적으로 사용자 정의 클래스를 LocalConnection 인스턴스에 추가하지 않고 사용자 정의 클래스 내에 메서드를 정의합니다. 이 방법은 다음 코드에서 확인할 수 있습니다.

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); 
        } 
    } 
}

CustomLocalConnection 클래스의 새 인스턴스를 만들려면 다음 코드를 사용할 수 있습니다.

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

콜백 메서드를 추가하는 두 번째 방법은 LocalConnection.client 속성을 사용하는 것입니다. 다음 코드와 같이 사용자 정의 클래스를 만들고 새 인스턴스를 client 속성에 할당하는 것입니다.

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

LocalConnection.client 속성은 호출하면 안 되는 객체 콜백 메서드를 나타냅니다. 앞의 코드에서 client 속성은 사용자 정의 클래스 CustomClient의 새 인스턴스로 설정되었습니다. client 속성의 기본값은 현재 LocalConnection 인스턴스입니다. 윈도우 하나의 버튼이 두 번째 윈도우의 보기를 전환하는 응용 프로그램에서 메서드 설정은 같지만 다르게 작동하는 두 개의 데이터 핸들러가 있는 경우 client 속성을 사용할 수 있습니다.

CustomClient 클래스를 만들려면 다음 코드를 사용할 수 있습니다.

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

동적 클래스를 만들고 동적으로 메서드를 추가하는 등 콜백 메서드를 추가하는 세 번째 방법은 다음 코드에서 보듯이 이전 버전의 ActionScript에서 LocalConnection 클래스를 사용하는 것과 매우 비슷합니다.

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

다음 코드를 사용하여 이 클래스에 콜백 메서드를 동적으로 추가할 수 있습니다.

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

앞에서 설명한 콜백 메서드 추가 방법은 코드를 옮기기가 매우 어려우므로 사용하지 않는 것이 좋습니다. 뿐만 아니라 동적 속성에 액세스하는 경우 봉인된 속성에 액세스하는 경우보다 속도가 크게 느리므로 이 방법을 사용하여 로컬 연결을 만들면 성능 문제가 발생할 수 있습니다.

isPerUser 속성

Mac 컴퓨터에 둘 이상의 사용자가 로그인한 경우 발생하는 충돌을 해결할 수 있도록 isPerUser 속성이 Flash Player(10.0.32)와 AIR(1.5.2)에 추가되었습니다. 다른 운영 체제에서는 로컬 연결의 범위가 항상 개별 사용자로 제한되어 왔으므로 이 속성이 무시됩니다. isPerUser 속성은 새로운 코드에서 true 로 설정되어야 합니다. 그러나 이전 버전과의 호환성을 위해 기본값은 현재 false 입니다. 이후 버전의 런타임에서는 기본값이 변경될 수 있습니다.

두 응용 프로그램 간 메시지 송신

LocalConnection 클래스를 사용하면 서로 다른 AIR 응용 프로그램 간은 물론 브라우저에서 실행되는 서로 다른 Adobe® Flash® Player(SWF) 응용 프로그램 간에 통신할 수 있습니다. 또한 브라우저에서 실행하는 AIR 응용 프로그램 및 SWF 응용 프로그램 간에도 통신할 수 있습니다.

예를 들어 웹 페이지에 여러 Flash Player 인스턴스가 있거나 Flash Player 인스턴스가 팝업 윈도우의 Flash Player 인스턴스에서 데이터를 가져오도록 할 수 있습니다.

다음 코드에서는 서버처럼 작동하고 다른 응용 프로그램에서의 수신 LocalConnection 호출을 허용하는 LocalConnection 객체를 정의합니다.
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"); 
            } 
        } 
    } 
}

우선 이 코드는 lc 라는 LocalConnection 객체를 만들고 client 속성을 clientObject 객체로 설정합니다. 다른 응용 프로그램이 이 LocalConnection 인스턴스에서 메서드를 호출하면 런타임이 clientObject 객체에서 해당 메서드를 찾습니다.

지정한 이름의 연결이 이미 있는 경우 객체가 이미 연결되어 있어 해당 연결이 실패했음을 나타내는 인수 오류 예외가 발생합니다.

Flash Player 인스턴스가 이 SWF 파일에 연결하고 지정된 로컬 연결의 메서드를 호출하려 할 때마다 CustomClient1 클래스로 설정된 client 속성에서 지정한 클래스에 요청이 전송됩니다.

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 서버를 만들려면 LocalConnection.connect() 메서드를 호출하고 고유한 연결 이름을 입력하십시오. 지정한 이름의 연결이 이미 있는 경우 객체가 이미 연결되어 있어 연결하지 못했음을 나타내는 ArgumentError 오류가 생성됩니다.

다음 코드에서는 conn1 이라는 이름으로 LocalConnection을 만드는 방법을 보여 줍니다.
try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}
보조 응용 프로그램에서 기본 응용 프로그램에 연결하려면 송신 LocalConnection 객체에서 새 LocalConnection 객체를 만든 다음 연결 이름 및 실행할 메서드 이름으로 LocalConnection.send() 메서드를 호출해야 합니다. 예를 들어 doQuit 메서드를 이전에 만든 LocalConnection 객체에 전송하려면 다음 코드를 사용합니다.
sendingConnection.send("conn1", "doQuit");

다음 코드는 기존 LocalConnection 객체를 conn1 이라는 연결 이름으로 연결하고 원격 응용 프로그램에서 doMessage() 메서드를 호출합니다. 원격 응용 프로그램에 매개 변수를 보내려면 다음 코드에 나와 있는 대로 send() 메서드의 메서드 이름 뒤에 추가 인수를 지정합니다.

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

서로 다른 도메인의 내용 및 AIR 응용 프로그램에 연결

특정 도메인에서만 통신할 수 있도록 하려면 LocalConnection 클래스의 allowDomain() 또는 allowInsecureDomain() 메서드를 호출하고 이 LocalConnection 객체에 액세스할 수 있는 하나 이상의 도메인 목록을 전달하여 허용되는 하나 이상의 도메인 이름을 전달합니다.

이전 버전의 ActionScript에서 LocalConnection.allowDomain() LocalConnection.allowInsecureDomain() 은 개발자에 의해 구현되어야 하고 부울 값을 반환해야 하는 콜백 메서드였습니다. ActionScript 3.0에서 LocalConnection.allowDomain() LocalConnection.allowInsecureDomain() 은 기본 제공 메서드입니다. 따라서 개발자는 허용할 도메인 이름 하나 이상을 전달하여 Security.allowDomain() Security.allowInsecureDomain() 처럼 호출만 하면 됩니다.

Flash Player 8은 로컬 SWF 파일에 대한 보안 제한 사항을 추가했습니다. 인터넷 액세스가 허용된 SWF 파일이라도 로컬 파일 시스템에 액세스할 수 있는 권한은 없습니다. localhost 를 지정하면 임의의 로컬 SWF 파일이 SWF 파일에 액세스할 수 있습니다. LocalConnection.send() 메서드가 호출 코드가 액세스 권한을 가지고 있지 않은 보안 샌드박스로부터 SWF 파일과 통신하려고 하면 securityError 이벤트( SecurityErrorEvent.SECURITY_ERROR )가 전달됩니다. 이 오류를 해결하려면 수신자의 LocalConnection.allowDomain() 메서드에서 호출자의 도메인을 지정합니다.

LocalConnection.allowDomain() LocalConnection.allowInsecureDomain() 메서드에 전달할 수 있는 특수한 값은 * localhost 두 가지입니다. 별표 값 (*) 은 모든 도메인에서 액세스를 허용합니다. 문자열 localhost 는 로컬로 설치되지만 응용 프로그램 리소스 디렉토리 외부의 내용에서 응용 프로그램에 대한 호출을 허용합니다.

LocalConnection.send() 메서드가 호출 코드에 액세스 권한이 없는 보안 샌드박스로부터 응용 프로그램과 통신하려고 하면 securityError 이벤트 (SecurityErrorEvent.SECURITY_ERROR )가 전달됩니다. 이 오류를 해결하려면 수신자의 LocalConnection.allowDomain() 메서드에서 호출자의 도메인을 지정합니다.

같은 도메인의 SWF 내용 간 통신만 구현하는 경우 밑줄( _ )로 시작하지 않고 도메인 이름(예: myDomain:connectionName )을 지정하지 않는 connectionName 매개 변수를 지정할 수 있습니다. LocalConnection.connect(connectionName) 명령에서 같은 문자열을 사용합니다.

서로 다른 도메인의 내용 간 통신을 구현하는 경우 밑줄로 시작하는 connectionName 매개 변수를 지정합니다. 밑줄을 지정하면 수신 LocalConnection 객체가 있는 내용을 도메인 간에 보다 자유롭게 이동할 수 있습니다. 다음과 같은 두 가지 경우가 가능합니다.

  • connectionName 의 문자열이 밑줄로 시작하지 않을 경우 런타임은 상위 도메인 이름과 콜론이 포함된 접두어(예: myDomain:connectionName )를 추가합니다. 이렇게 하면 이름이 같은 다른 도메인의 연결과 충돌하지 않지만 모든 송신 LocalConnection 객체는 이 상위 도메인(예: myDomain:connectionName )을 지정해야 합니다. 수신 LocalConnection 객체가 있는 HTML 또는 SWF 파일을 다른 도메인으로 이동하면 런타임이 새 상위 도메인이 반영되도록 접두어를 변경합니다(예: anotherDomain:connectionName ). 모든 송신 LocalConnection 객체는 새 상위 도메인을 가리키도록 수동으로 편집해야 합니다.

  • connectionName 의 문자열이 밑줄(_)로 시작할 경우(예: _connectionName ) 런타임은 접두어를 문자열에 추가하지 않습니다. 즉, 수신 및 송신 LocalConnection 객체가 connectionName 에 동일한 문자열을 사용한다는 것을 의미합니다. 수신 객체에서 LocalConnection.allowDomain() 을 사용하여 모든 도메인의 연결을 승인하도록 지정할 경우 송신 LocalConnection 객체를 변경하지 않고 수신 LocalConnection 객체가 있는 HTML 또는 SWF 파일을 다른 도메인으로 이동할 수 있습니다.

    connectionName 에 밑줄 이름을 사용할 때의 단점은 두 응용 프로그램 모두 동일한 connectionName 을 사용하여 연결을 시도하는 경우와 같이 충돌 가능성이 있다는 것입니다. 두 번째 단점은 보안 문제입니다. 밑줄 구문을 사용하는 연결 이름은 수신 응용 프로그램의 도메인을 식별하지 않습니다. 이러한 이유 때문에 도메인 정규화된 이름을 선호합니다.

Adobe AIR

AIR 응용 프로그램 보안 샌드박스에서 실행 중인 내용(AIR 응용 프로그램과 함께 설치되는 내용)과 통신하려면 연결 이름의 앞에 AIR 응용 프로그램을 식별하는 수퍼 도메인을 추가해야 합니다. 수퍼 도메인 문자열은 app# 으로 시작하며, 응용 프로그램 ID, 점(.) 문자, 제작자 ID(정의된 경우)가 차례로 뒤에 이어집니다. 예를 들어 응용 프로그램 ID가 com.example.air.MyApp 이고 제작자 ID가 없는 응용 프로그램의 connectionName 매개 변수에서 사용할 올바른 수퍼 도메인은 "app#com.example.air.MyApp" 입니다. 따라서 기본 연결 이름이 "appConnection"인 경우 connectionName 매개 변수에서 사용할 전체 문자열은 "app#com.example.air.MyApp:appConnection" 입니다. 응용 프로그램에 제작자 ID가 있는 경우에는 "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1" 과 같이 해당 ID도 수퍼 도메인 문자열에 포함되어야 합니다.

다른 AIR 응용 프로그램이 로컬 연결을 통해 응용 프로그램과 통신할 수 있도록 허용하는 경우 LocalConnection 객체의 allowDomain() 을 호출하여 로컬 연결 도메인 이름으로 전달해야 합니다. AIR 응용 프로그램의 경우 이 도메인 이름은 연결 문자열과 동일한 방식으로 응용 프로그램 및 제작자 ID를 사용하여 형성됩니다. 예를 들어 보내는 AIR 응용 프로그램의 응용 프로그램 ID가 com.example.air.FriendlyApp 이고 제작자 ID가 214649436BD677B62C33D02233043EA236D13934.1 인 경우 이 응용 프로그램에서 연결할 수 있도록 허용하는 데 사용할 도메인 문자열은 app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1 입니다. AIR 1.5.3 현재, 일부 AIR 응용 프로그램에는 제작자 ID가 없습니다.