1

これは多くの人に触れられていることを私は知っています、しかし、それにもかかわらず、私はそれを理解していません。あなたたちが私に耐えることができれば:(

だから、私はこのコードを持っています:

import flash.net.*;
import fl.controls.*;
import flash.events.MouseEvent;
import flash.events.DataEvent;
import flash.events.SecurityErrorEvent;

var mySocket = new XMLSocket();
trace(Security.sandboxType)
pushMsg.addEventListener(MouseEvent.CLICK, realsedButton);
//mySocket.connect("192.124.5.2",9999);
mySocket.addEventListener(Event.CONNECT, xmlsocket);
mySocket.addEventListener(Event.CLOSE, xmlsocket);
mySocket.addEventListener(IOErrorEvent.IO_ERROR, xmlsocket);
mySocket.addEventListener(DataEvent.DATA, dataHandler);
mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityHandler);   

msgArea.htmlText = "Started!";
connectToServer();
function connectToServer()
{
    msgArea.htmlText += "Inside connect To Server";
    mySocket.connect("localhost",9999);
}

function securityHandler(evt: SecurityErrorEvent)
{
    msgArea.htmlText += "SecurityError";
}

function dataHandler(evt:DataEvent)
{
    trace("Inside dataHandler")
    var xml = XML(evt.target.data);
    msgArea.htmlText += xml;
}


function xmlsocket(Event)
{
    msgArea.htmlText += "inside xmlSocket";
    switch(Event.type)
    {
        case 'ioError':
            msgArea.htmlText += "Inside dataHandler";
            msgArea.htmlText += "<b>Server connection failed!</b>";
            break;

        case 'connect':
            msgArea.htmlText +="Inside Connect";
            msgArea.htmlText += "<b>Server connection establed!</b>";
            break;

        case 'close':
            msgArea.htmlText +="Inside Close";
            msgArea.htmlText += "<b>Server connection lost</b>";
            break;
    }
}
function msgGO() 
{
    msgArea.htmlText +="Inside msgGO";
    if (inputMsg.htmlText != "") 
    {
        msgArea.htmlText +="Inside msgGo2";
        mySocket.send(inputMsg.htmlText+"\n");
        inputMsg.htmlText = "";
    }
}

function realsedButton(evt:MouseEvent)
{
    msgArea.htmlText +="Inside ReleasedButton";
    msgGO();
}

私はたくさんのテストを行いました、私はそれをすべてきちんと要約しようとします。

Flashから直接実行し(ctrl + enter)、ソケットサーバーがオフラインアクセス許可がネットワークに設定され、mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR、securityHandler)行がコメントアウトされている場合

出力は次のとおりです。

  • 始めました!
  • サーバーへの接続の内部
  • xmlsocketの内部
  • dataHandlerの内部
  • サーバー接続に失敗しました

エラー#2044未処理のセキュリティerror.txt =エラー#2048セキュリティサンドボックス違反ファイル/// G | /flash%20Stuff/socketClientNetwork.swfは、socketClientNetwork_fla :: maintimeline / frame 1 {}のlocalhost:9999からデータを読み込めません。

SWFから実行し、ソケットサーバーがオフラインで、アクセス許可がネットワークに設定されていて、(上からの)回線がコメントアウトされていない 場合出力は次のとおりです。

  • 始めました!

    サーバーへの接続の内部

    セキュリティエラー

Flashから直接実行し(ctrl + enter)、ソケットサーバーがオフラインでアクセス許可がローカルに設定され、行mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR、securityHandler)がコメントアウトされている場合

出力は次のとおりです。

  • 始めました!
  • サーバーへの内部接続
  • xmlsocketの内部
  • データハンドラーの内部
  • サーバー接続に失敗しました

エラー#2044未処理のセキュリティerror.txt =エラー#2048セキュリティサンドボックス違反ファイル/// G | /flash%20Stuff/socketClientLocal.swfは、socketClientLocal_fla :: maintimeline / frame 1 {}のlocalhost:9999からデータを読み込めません。

SWFとソケットサーバーから実行され、ソケットサーバーがオフラインで、アクセス許可がローカルに設定されていて、(上記のように)回線がコメント化されていない場合

  • 始めました!
  • サーバーへの接続の内部
  • セキュリティエラー

SWF::オンライン::ローカル::コメント

  • 始めました!
  • サーバーへの接続の内部
  • セキュリティエラー

FLA::オンライン::ローカル::コメントなし

  • 始めました!
  • サーバーへの接続の内部
  • xmlsocketの内部
  • サーバーへの内部接続
  • 接続が確立されました

SWF :: Online ::Network::コメント

  • 始めました!
  • サーバーへの接続の内部
  • セキュリティエラー

FLA :: Online :: Network ::Uncommented

  • 始めました!
  • 内部はサーバーに接続します
  • xmlソケット内
  • 内部接続
  • サーバー接続が確立されました
4

1 に答える 1

0

ファイルシステム上のswfをローカルWebサーバーのドキュメントルートフォルダーまたはそのサブフォルダーに移動してから、ブラウザーのアドレスバーに入力する必要があります。

http://localhost/socketClientLocal.swf

それ以外の

file:///G|/flash%20Stuff/socketClientLocal.swf

さらに、次の名前のいわゆる「ソケットポリシーファイル」を作成する必要がありますcrossdomain.xml

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="localhost" toports="*"/>
</cross-domain-policy>

Flash Playerでは、最初にこのconnect()ファイルを読み込もうとします。ロードに失敗した場合、または設定によってアクセスが制限された場合、FlashPlayerは発生したセキュリティエラーもトリガーします。

Flash Playerはcrossdomain.xml、次の順序でをロードしようとします。

  • 渡したサーバーのポート843(この場合はconnect()localhost:843)
  • 渡したserver:port connect()(この場合はlocalhost:9999)

今、2つのオプションがあります:

  • crossdomain.xmlのみを提供する追加のサーバーをポート843に作成します
  • 独自のサーバーでcrossdomain.xmlを提供します

ここには多くの役立つ情報があります。また、すぐに使用できるソケットポリシーサーバーソフトウェア(ポート843用)をWeb全体で見つけることができます。例: Apacheの場合はmod_socket_policy_server。ヒント:「ソケットポリシーサーバー」のGoogle

幸運を!

于 2012-12-23T00:22:16.063 に答える