최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

swf와 swf간의 통신에 있어서는 대게 Loader클래스를 사용하여 제어 한다.

 

이를 위해서 Loadder클래스의 contentLoaderInfo메서드를 써야하고, HTTP요청을 위해 URLrequest 클래스가 들어가고..

 

무엇보다, 이러한 형태의 가장 큰 동작방식은 부모컨테이너에 child 성격의 swf가 로드되는 형식이다.

 

쉽게 이야기 하자면 2.0에서 container_mc 객체를 통해 loadMovie, loadMovieNum 메서드를 사용하여 swf를 불러온다는 것과

 

비슷하게 이해하면 된다.

 

그런데 ...그러한 종속적인 개념없이 순수하게 Client에서의 swf와 swf간의 통신은 어떻게 할까?

 

즉, A.swf, B.swf 두개의 플레이어를 띄어놓고 A.swf 에서 버튼을 누르면 B.swf에서 공이 움직이는 것처럼.

 

이것은  LocalConnection 클래스를 사용하면, 단일 혹은 여러개의 SWF간의 통신이 가능하다.

 

내가 구현한 결과는 아래와같다.

 


 

송신.swf

 

 

수신.swf

 

 

 

 

주의할것은, 크로스 부라우징의 해결문제이다.

 

이는 수신부쪽의 LocalConnection을 작성할때 4번 라인과 같이 간단하게 해결이 가능하다.


var conn:LocalConnection;
conn = new LocalConnection();
conn.connect('serpikoConnect')
conn.allowDomain('*');
conn.client = this;

 

3 : allowDomain('*') // 모든도메인 허용처리로 보안을 해제한다.


 

ActionScript3.0 의 API의 예제소스는 다음과 같다.

 

다음 예제는 두 개의 개별 SWF 파일로 컴파일되어야 하는 두 개의 ActionScript 클래스로 구성되어 있습니다.


LocalConnectionSenderExample SWF 파일에서는 LocalConnection 인스턴스가 만들어지고, 버튼을 누르면 call() 메서드를 사용하여


SWF 파일의 lcHandler 메서드를 "myConnection"이라는 연결 이름으로 호출하게 됩니다.


이때 TextField의 내용이 매개 변수로 전달됩니다.

 

LocalConnectionReceiverExample SWF 파일에서는 LocalConnection 인스턴스가 만들어지고, connect() 메서드가 호출되어 


이 SWF 파일을 "myConnection"이라는 이름의 연결로 보내는 메시지의 수신자로 지정합니다. 또한 이 클래스에는 lcHandler()라는 


이름의 공용 메서드가 포함되어 있습니다. 이 메서드는 LocalConnectionSenderExample SWF 파일에 의해 호출됩니다. 


이 메서드가 호출되면, 매개 변수로 전달된 텍스트가 스테이지의 TextField에 첨부됩니다.

 

참고: 이 예제를 테스트하려면 두 SWF 파일 모두 동일한 컴퓨터에 동시에 로드되어야 합니다.

 

송신부)


// Code in LocalConnectionSenderExample.as
package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.net.LocalConnection;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.events.StatusEvent;
    import flash.text.TextFieldAutoSize;

    public class LocalConnectionSenderExample extends Sprite {
        private var conn:LocalConnection;
        
        // UI elements
        private var messageLabel:TextField;
        private var message:TextField;
        private var sendBtn:Sprite;
        
        public function LocalConnectionSenderExample() {
            buildUI();
            sendBtn.addEventListener(MouseEvent.CLICK, sendMessage);
            conn = new LocalConnection();
            conn.addEventListener(StatusEvent.STATUS, onStatus);
        }
        
        private function sendMessage(event:MouseEvent):void {
            conn.send("myConnection", "lcHandler", message.text);
        }
        
        private function onStatus(event:StatusEvent):void {
            switch (event.level) {
                case "status":
                    trace("LocalConnection.send() succeeded");
                    break;
                case "error":
                    trace("LocalConnection.send() failed");
                    break;
            }
        }
        
        private function buildUI():void {
            const hPadding:uint = 5;
            // messageLabel
            messageLabel = new TextField();
            messageLabel.x = 10;
            messageLabel.y = 10;
            messageLabel.text = "Text to send:";
            messageLabel.autoSize = TextFieldAutoSize.LEFT;
            addChild(messageLabel);
            
            // message
            message = new TextField();
            message.x = messageLabel.x + messageLabel.width + hPadding;
            message.y = 10;
            message.width = 120;
            message.height = 20;
            message.background = true;
            message.border = true;
            message.type = TextFieldType.INPUT;
            addChild(message);
            
            // sendBtn
            sendBtn = new Sprite();
            sendBtn.x = message.x + message.width + hPadding;
            sendBtn.y = 10;
            var sendLbl:TextField = new TextField();
            sendLbl.x = 1 + hPadding;
            sendLbl.y = 1;
            sendLbl.selectable = false;
            sendLbl.autoSize = TextFieldAutoSize.LEFT;
            sendLbl.text = "Send";
            sendBtn.addChild(sendLbl);
            sendBtn.graphics.lineStyle(1);
            sendBtn.graphics.beginFill(0xcccccc);
            sendBtn.graphics.drawRoundRect(0, 0, (sendLbl.width + 2 + hPadding + hPadding), (sendLbl.height + 2), 5, 5);
            sendBtn.graphics.endFill();
            addChild(sendBtn);
        }
    }
}

 

수신부)


// Code in LocalConnectionReceiverExample.as
package {
    import flash.display.Sprite;
    import flash.net.LocalConnection;
    import flash.text.TextField;

    public class LocalConnectionReceiverExample extends Sprite {
        private var conn:LocalConnection;
        private var output:TextField;
        
        public function LocalConnectionReceiverExample()     {
            buildUI();
            
            conn = new LocalConnection();
            conn.client = this;
            try {
                conn.connect("myConnection");
            } catch (error:ArgumentError) {
                trace("Can't connect...the connection name is already being used by another SWF");
            }
        }
        
        public function lcHandler(msg:String):void {
            output.appendText(msg + "\n");
        }
        
        private function buildUI():void {
            output = new TextField();
            output.background = true;
            output.border = true;
            output.wordWrap = true;
            addChild(output);
        }
    }
}

 

 

 

댓글