1

Flex/Flash を使用して、ローカル マシンで実行されているサードパーティのビデオ会議アプリとブラウザから通信しようとしています。ユーザーが私たちのウェブページにログインできるという考えは、ページがローカルアプリを開いて適切なチャットルームに移動するように指示します. 混合ソースの警告をバイパスするには、ブリッジとしてフラッシュが必要です。私の AS コード:

    public function Check():void {  
        import flash.events.SecurityErrorEvent;
        import flash.external.ExternalInterface;
        import flash.net.Socket;
        import flash.system.Security;

        var mySocket:Socket = new Socket();
        Security.loadPolicyFile('xmlsocket://127.0.0.1:63457');

        mySocket.addEventListener(Event.CONNECT, onConnect);
        mySocket.addEventListener(Event.CLOSE,onClose);
        mySocket.addEventListener(IOErrorEvent.IO_ERROR, onError);
        mySocket.addEventListener(ProgressEvent.SOCKET_DATA, onProgress);
        mySocket.addEventListener(DataEvent.DATA, onData);
        mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);

        function onConnect(event:Event):void {
            trace('connect');
        }

        function onClose(event:Event):void {
            trace('close');
        }

        function onProgress(event:ProgressEvent):void {
            trace('Progressevent fired');
            var output:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
            ExternalInterface.call("alert", output);
        }

        function onData(event:DataEvent):void {
            trace('onData fired');

        }

        function onSecurityError(event:ErrorEvent) : void {
            trace("SECURITY ERROR : " +  event.text);
            ExternalInterface.call("alert", 'error: ' + event.text, 0);
        }

        function onError(event:ErrorEvent) : void {
            trace("ERROR : " +  event.text);
            ExternalInterface.call("alert", 'error: ' + event.text, 0);
        }

        mySocket.connect("127.0.0.1", 63457);
        mySocket.writeMultiByte('GET /?url=http://app.mydomain.com HTTP/1.1', 'UTF-8');
        mySocket.flush();
    };

ローカルでの実行はすべてうまくいき、「onProgress」リスナーが起動され、リクエストに応答するアプリが表示されます。ただし、別のドメインから実行すると失敗します。サンドボックス エラーは発生しません。呼び出しが行われていないようなものです。リモート デバッガーは、接続が正常に確立されたことを示します。

おそらくコードからわかるように、私は AS3 の初心者ですが、ここでこの質問をする前にかなりの調査を行いました。誰かが助けてくれることを願っています。このコードを Flash Pro、Flash Builder (AS プロジェクトと Flex プロジェクトの両方) で試してみましたが、同じ結果になりました。

4

1 に答える 1

0

これはタイミングの問題だったようです。mySocket.writeMultiByte呼び出しは、ソケットがデータを交換する準備ができる前に発生しました。connecthandlerで呼び出しを行うと、問題が解決しました。

ロギングの提案をありがとう、本当に助けてくれました!

コード:

    import flash.events.SecurityErrorEvent;
    import flash.events.HTTPStatusEvent;
    import flash.external.ExternalInterface;
    import flash.net.Socket;
    import flash.system.Security;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    var mySocket:Socket = new Socket();

    mySocket.addEventListener(Event.CONNECT, onConnect);
    mySocket.addEventListener(Event.CLOSE,onClose);
    mySocket.addEventListener(IOErrorEvent.IO_ERROR, onError);
    mySocket.addEventListener(ProgressEvent.SOCKET_DATA, onProgress);
    mySocket.addEventListener(DataEvent.DATA, onSocketData);
    mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);

    function onConnect(event:Event):void
    {
        trace('connect');
        // ready to send!
        mySocket.writeMultiByte('GET /?url=http://app.mydomain.com HTTP/1.1', 'UTF-8');
    }

    function onClose(event:Event):void
    {
        trace('close');
    }

    function onProgress(event:ProgressEvent):void
    {
        var output:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
        trace('Progressevent fired: \n' + output + '\n-----------');

    }

    function onSocketData(event:DataEvent):void
    {
        trace('onSocketData fired');

    }

    function onSecurityError(event:ErrorEvent):void
    {
        trace("SECURITY ERROR : " +  event.text);
    }

    function onError(event:ErrorEvent):void
    {
        trace("ERROR : " +  event.text);
    }

    mySocket.connect("127.0.0.1", 63457);
于 2013-01-29T10:06:37.747 に答える