【问题标题】:Air 2 ServerSocket Crossdomain problemAir 2 ServerSocket 跨域问题
【发布时间】:2011-05-10 08:35:18
【问题描述】:

我希望通过 ServerSocket 类创建一个 Air 2 服务器(您将在下面的代码中找到一个关于它的示例)。

约束:

  • 服务器必须在空中
  • 客户端必须通过网络浏览器显示

客户端显示在 Web 浏览器中,因此当客户端想要与 Air 服务器建立连接时,Flash 通过套接字发送跨域请求,服务器将其发送回来,但没有任何反应。

As3Doc 规定当 flash 发送跨域请求时,服务器必须将其发送回来,然后如果跨域正常,Flash 将关闭连接并打开一个新连接。

我尝试了不同的设置,但没有任何效果,客户端从未收到 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);
        }
    }
}

【问题讨论】:

    标签: actionscript-3 air client-server


    【解决方案1】:

    您的方法是正确的,但是您使用writeUTF 将 XML 策略文件写入套接字。 writeUTF 还将字符串的长度写入实际 UTF 字符串之前的两个字节。这会破坏客户端正在接收的 XML 策略文件。

    只需使用writeUTFBytes 而不是writeUTF,一切都会正常工作。

    另外,你不需要像你一样writeByte。将 null 字符附加到您的策略字符串就足够了。

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 2017-08-15
      • 2012-03-12
      • 2012-12-11
      • 2011-07-05
      相关资源
      最近更新 更多