[이 글은 이전에 쓰던 블로그에서 작성된 이후 새 블로그로 이전된 글입니다.]
사실 코드만 공개해도 되지만, 플래시의 보안 정책에 대한 이해 없이 코드만 본다면 아무런 도움이 안 될 것 같아서 설명하다 보니 조금 길어졌네요
다큐멘트 클래스처럼 적용시킵니다. 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(); //소켓에 정책 파일을 보냅니다. } } }