플래시 소켓 서버 – 4. 코드

[이 글은 이전에 쓰던 블로그에서 작성된 이후 새 블로그로 이전된 글입니다.]

사실 코드만 공개해도 되지만, 플래시의 보안 정책에 대한 이해 없이 코드만 본다면 아무런 도움이 안 될 것 같아서 설명하다 보니 조금 길어졌네요

다큐멘트 클래스처럼 적용시킵니다. AIR 설정에서 ‘포함된 파일’ 부분에 ‘policy.xml’ 이름을 가진 정책 파일 형태의 파일을 넣어주세요.

MIT 라이센스하에 배포하구요, 이것만 가지고는 소켓 서버를 못 만듭니다. 그냥 정책 파일 보내는 예제입니다.

정책 파일 보내는 포트와 실제 연결 포트가 다르다고 가정하고 짠 소스입니다.

클라이언트 측에서는 Security.loadPolicyFile("xmlsocket://127.0.0.1:843"); 등의 형태로 정책 파일을 요청하면 됩니다.

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent
    import flash.events.ServerSocketConnectEvent;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.net.ServerSocket;
    import flash.net.Socket;

    import fl.controls.TextArea;

    public class MySocketServer extends Sprite {
        private const TARGET_IP:String = "127.0.0.1"; //타겟 IP

        private var policyServer:ServerSocket;
        private const POLICY_PORT:int = 843; //타겟 포트

        public function MySocketServer():void {
            policyServer.addEventListener(ServerSocketConnectEvent.CONNECT, onPolicyConnected);
            policyServer.addEventListener(Event.CLOSE, serverClosed);

            policyServer.bind(POLICY_PORT, TARGET_IP); //서버 소켓을 바인드시킵니다.
            policyServer.listen();
        }

        private function onPolicyConnected(e:ServerSocketConnectEvent):void {
            var tmpSocket:Socket = e.socket as Socket;

            tmpSocket.addEventListener(ProgressEvent.SOCKET_DATA, policyDataHandler); //소켓의 정책 파일 요청을 감지합니다.
            tmpSocket.addEventListener(Event.CLOSE, onPolicyClosed);
            tmpSocket.addEventListener(IOErrorEvent.IO_ERROR, IOErrorOccured);
        }

        private function policyDataHandler(e:ProgressEvent):void {
            var tmpSocket:Socket = e.target as Socket;

            var message:String = tmpSocket.readUTFBytes(tmpSocket.bytesAvailable);

            sendPolicyFileTo(tmpSocket);
        }

        private function onPolicyClosed(e:Event):void {
            var tmpSocket:Socket = e.target as Socket;

            tmpSocket.removeEventListener(ProgressEvent.SOCKET_DATA, policyDataHandler);
            tmpSocket.removeEventListener(Event.CLOSE, onPolicyClosed);
            tmpSocket.removeEventListener(IOErrorEvent.IO_ERROR, IOErrorOccured);
        }

        private function IOErrorOccured(event:IOErrorEvent):void {
            trace("IOError : " + event.text);
        }

        private function sendPolicyFileTo(target:Socket):void {
            //AIR FLA 안에 정책 파일의 형태로 policy.xml을 넣어주세요.
            //AIR2 설정의 포함된 파일 부분에 넣으시면 됩니다.

            var file:File = new File(File.applicationDirectory.nativePath + File.separator + "policy.xml");
            var stream:FileStream = new FileStream();
            stream.open(file, FileMode.READ);
            var data:String = stream.readUTFBytes(stream.bytesAvailable);

            target.writeUTFBytes(data);
            target.writeByte(0);
            target.flush(); //소켓에 정책 파일을 보냅니다.
        }
    }
}

댓글 남기기