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里面
  • 内部数据处理程序
  • 服务器连接失败

错误 #2044 未处理的安全 error.txt = 错误 #2048 安全沙箱违规文件 ///G|/flash%20Stuff/socketClientNetwork.swf 无法在 socketClientNetwork_fla::maintimeline/frame 1 处从 localhost:9999 加载数据{}

如果从 SWF 运行并且套接字服务器处于 OFFLINE 状态并且权限设置为 Network并且该行(从上面)没有被注释掉 输出如下:

  • 开始了!

    内部连接到服务器

    安全错误

如果直接从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::Commented

  • 开始了!
  • 内部连接到服务器
  • 安全错误

FLA::Online::Network::未注释

  • 开始了!
  • 内部连接到服务器
  • 内部xml套接字
  • 内部连接
  • 服务器连接建立
4

1 回答 1

0

您必须将文件系统上的 swf 移动到本地 Web 服务器的文档根文件夹或其子文件夹,然后在浏览器地址栏中键入:

http://localhost/socketClientLocal.swf

代替

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

此外,您还必须创建一个名为“socket policy file”的文件crossdomain.xml

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

connect()Flash Player 上首先尝试加载此文件。如果加载失败或设置限制访问,Flash Player 也会触发您遇到的安全错误。

Flash Player 尝试按crossdomain.xml以下顺序加载:

  • 您传递到的服务器的端口 843 connect()(在您的情况下为 localhost:843)
  • 服务器:您传递给的端口connect()(在您的情况下为 localhost:9999)

现在你有两个选择:

  • 在仅服务 crossdomain.xml 的端口 843 上创建一个附加服务器
  • 通过您自己的服务器提供 crossdomain.xml

您会在这里找到许多有用的信息。您还可以在 Web 上找到现成的套接字策略服务器软件(用于端口 843)。例如Apache 的mod_socket_policy_server。提示:Google for 'socket policy server'

祝你好运!

于 2012-12-23T00:22:16.063 回答