2011-05-10 2 views
3

ServerSocket 클래스를 통해 Air 2 Server를 만들고 싶습니다. (아래 예제 코드가 있습니다).Air 2 ServerSocket Crossdomain 문제

제약 :

  • 서버가 공기에 있어야합니다
  • 클라이언트는 웹 브라우저를 통해 표시해야

클라이언트는 클라이언트에 대한 연결을 설정하려는 그래서 웹 브라우저로 표시됩니다 Air 서버, Flash는 소켓을 통해 크로스 도메인 요청을 보내고 서버는 서버로 다시 보냅니다.

As3Doc은 플래시가 크로스 도메인 요청을 전송할 때 서버가이를 되돌려 보내야한다는 것을 지정합니다. 그런 다음 crossdomain이 올바르면 서버가 연결을 닫고 새 연결을 엽니 다.

다른 설정을 시도했지만 아무런 효과가 없으므로 클라이언트는 CONNECTED의 이벤트를받지 못합니다.

아이디어가 있으십니까?

서버 측 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" initialize="init()"> 

    <s:TextArea x="0" y="0" width="100%" height="100%" id="log"/> 

    <fx:Script> 
     <![CDATA[ 
      private var _server : ServerSocket = new ServerSocket; 

      private function init() : void 
      { 
       _server.bind(4500, "127.0.0.1"); 
       _server.addEventListener(ServerSocketConnectEvent.CONNECT, onClientConnection); 
       _server.listen(); 
      } 

      private function onClientConnection(e : ServerSocketConnectEvent) : void 
      { 
       var socket : Socket = e.socket; 
       log.appendText("Client connected : " + socket.localAddress + ":" + socket.localPort + "\n"); 
       socket.addEventListener(ProgressEvent.SOCKET_DATA, onData); 
      } 

      private function onData(e:Event) : void 
      { 
       var socket : Socket = e.target as Socket; 
       log.appendText("Data : " + socket.readUTFBytes(socket.bytesAvailable)); 
       socket.writeUTF(
        '<cross-domain-policy>' + 
        '  <allow-access-from domain="*" to-ports="4500" />' + 
        '</cross-domain-policy>' 
        + String.fromCharCode(0) 
        ); 
       socket.writeByte(0); 
       socket.flush(); 
       socket.close(); 
      } 
     ]]> 
    </fx:Script> 
</s:WindowedApplication> 

클라이언트 측 코드 :

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.net.Socket; 
    import flash.text.TextField; 
    import flash.utils.setTimeout; 

    public class TestClient extends Sprite 
    { 
     private var log : TextField; 
     private var _socket : Socket; 

     public function TestClient() 
     { 
      log = new TextField; 
      log.width = stage.stageWidth; 
      log.height = stage.stageHeight; 
      addChild(log); 

      _socket = new Socket; 
      _socket.addEventListener(Event.CONNECT, onConnection); 
      _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); 
      _socket.addEventListener(IOErrorEvent.IO_ERROR, onError); 
      tryConnection(); 
     } 

     private function tryConnection() : void 
     { 
      log.appendText("Try connection ... \n"); 
      _socket.connect("127.0.0.1", 4500); 
     } 

     private function onConnection(e : Event) : void 
     { 
      log.appendText("Connected !"); 
     } 

     private function onError(e : Event) : void 
     { 
      log.appendText(e.toString() + "\n"); 
      setTimeout(tryConnection, 1000); 
     } 
    } 
} 

답변

2

접근 방식이 옳다,하지만 당신은 소켓에 XML 정책 파일을 적어 writeUTF을 사용하고 있습니다. writeUTF은 실제 UTF 문자열 앞에 2 바이트의 문자열 길이를 씁니다. 클라이언트가 수신하는 XML 정책 파일이 손상되었습니다.

writeUTF 대신 writeUTFBytes을 사용하면 모든 것이 올바르게 작동합니다.

또한 너는 writeByte처럼 할 필요가 없습니다. null 문자를 정책 문자열에 추가하면 충분합니다.

+0

너무 가까이서 : '( –