다른 Flash Player 및 AIR 인스턴스에 연결



LocalConnection 클래스를 사용하면 HTML 컨테이너의 SWF나 포함된 플레이어 또는 독립 실행형 플레이어의 SWF 등 서로 다른 Flash Player 및 AIR 인스턴스 간에 통신할 수 있습니다. 따라서 웹 브라우저에서 실행되는 SWF 파일이나 데스크톱 응용 프로그램에 포함된 SWF 파일 등 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 객체를 가장 간단하게 사용할 수 있는 방법은 동일한 도메인에 위치한 LocalConnection 객체 사이에서만 통신을 허용하는 것입니다. 그러면 보안 문제에 대해 걱정하지 않아도 됩니다. 서로 다른 도메인 사이에서 통신해야 하는 경우, 보안 문제를 해결할 수 있는 몇 가지 방법이 있습니다. 자세한 내용은 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); 
        } 
    } 
}

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

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

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

두 Flash Player 인스턴스 간 메시지 보내기

LocalConnection 클래스를 사용하여 여러 가지 Flash Player 및 Adobe AIR의 인스턴스 간에 통신합니다. 예를 들어, 웹 페이지에 여러 Flash Player 인스턴스가 있거나 Flash Player 인스턴스가 팝업 창의 Flash Player 인스턴스에서 데이터를 가져오도록 할 수 있습니다.

다음 코드에서는 서버처럼 작동하고 다른 Flash Player 인스턴스에서 수신 호출을 허용하는 로컬 연결 객체를 정의합니다.

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 속성을 사용자 정의 클래스인 CustomClient1로 설정합니다. 다른 Flash Player 인스턴스에서 이 로컬 연결 인스턴스에 있는 메서드를 호출하면 Flash Player가 CustomClient1 클래스에서 해당 메서드를 찾습니다.

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이라는 이름으로 새 소켓 연결을 만드는 방법을 보여 줍니다.

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

보조 SWF 파일에서 기본 SWF 파일을 연결하려면 전송하는 LocalConnection 객체에서 새 LocalConnection 객체를 만든 다음 연결 이름 및 실행할 메서드 이름으로 LocalConnection.send() 메서드를 호출해야 합니다. 예를 들어, 이전에 만든 LocalConnection 객체에 연결하려면 다음 코드를 사용합니다.

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

다음 코드는 기존 LocalConnection 객체를 conn1이라는 연결 이름으로 연결하고 원격 SWF 파일에서 doQuit() 메서드를 호출합니다. 원격 SWF 파일에 매개 변수를 전송하려면 다음 코드 예제에서 보듯이 send() 메서드의 메서드 이름 뒤에 추가 인수를 지정합니다.

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

여러 도메인에서 SWF 문서에 연결

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

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

LocalConnection.allowDomain()LocalConnection.allowInsecureDomain() 메서드에 전달할 수 있는 특수한 값은 *localhost 두 가지입니다. 별표 값 (*)은 모든 도메인에서 액세스를 허용합니다. localhost 문자열은 로컬로 설치된 SWF 파일에서 이 SWF 파일을 호출할 수 있도록 합니다.

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

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

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

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

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