Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 为什么Flash播放器在这种情况下抛出沙盒错误?_Apache Flex_Flash_Sockets_Sandbox - Fatal编程技术网

Apache flex 为什么Flash播放器在这种情况下抛出沙盒错误?

Apache flex 为什么Flash播放器在这种情况下抛出沙盒错误?,apache-flex,flash,sockets,sandbox,Apache Flex,Flash,Sockets,Sandbox,在连接到Java(1.5)服务器上的套接字后,我收到一个Flex 3沙盒错误#2048。服务器代码都是我的,即不在Apache下运行。Flash播放器10.0 r32 顺序如下 1 Java服务器启动,在端口843上侦听策略文件请求,在端口45455上侦听我的其他请求 Apache提供的2个Flex客户端(虽然如果从文件系统运行它,会得到相同的结果),在主机455上进行套接字连接 3 Flash Player从端口843请求策略文件。这是寻找主文件的新安全设置的标准行为。无论是否指定了其他策略文

在连接到Java(1.5)服务器上的套接字后,我收到一个Flex 3沙盒错误#2048。服务器代码都是我的,即不在Apache下运行。Flash播放器10.0 r32

顺序如下

1 Java服务器启动,在端口843上侦听策略文件请求,在端口45455上侦听我的其他请求

Apache提供的2个Flex客户端(虽然如果从文件系统运行它,会得到相同的结果),在主机455上进行套接字连接

3 Flash Player从端口843请求策略文件。这是寻找主文件的新安全设置的标准行为。无论是否指定了其他策略文件,都会发生这种情况

4我通过端口843从Java提供以下XML:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
</cross-domain-policy>
端口45455上侦听的7个Java服务器线程响应为

REG:0/REGISTER:SUCCESS;simon;Si
8 Flex客户端接收ProgressEvent,并调用绑定到套接字的事件侦听器。我处理消息(将其写入屏幕上的文本框)

9 Flash播放器抛出2048沙盒错误,套接字断开连接!这是在成功接收和处理消息之后。事实上,大约是12秒后。其他任何东西都不能通过插座工作

我尝试在Flex客户端中通过调用
Security.loadPolicyFile()
显式加载策略文件,但新播放器安全性的现实是它基本上被忽略了。步骤是,在套接字i/o操作发生之前,不会发送策略请求。此时,播放机总是先到端口843查找主策略文件。如果它找到了一个,并且它是允许的,那么它就不会继续了

我尝试了多种终止策略文件和策略文件内容的替代方法,包括故意错误,只是为了查看Flash Player是否处于唤醒状态

我看不出有什么理由要扔2048。我在指定的主安全端口上准确地提供套接字策略文件,播放机本身将其记录为正确的。然后,套接字成功地从服务器发送和接收一条消息,我的代码可以使用该消息的内容

有人知道为什么会发生这种情况吗?Flash播放器bug

p.S.请不要告诉我使用BlazeDS、LCD、Granite或其他东西作为服务器,我正在寻找解决此问题的方法,而不是重新设计。请不要让我使用XMLSocket,我试过了,得到了完全相同的结果。我仔细地选择了我的体系结构,我想要一个二进制套接字

编辑 针对James Ward在评论中的请求,以下是完整的错误消息:

Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.
我有一个精简的测试客户端,它为每个套接字事件都有一个处理程序,并向屏幕输出一条消息。这就是它所显示的:

RequestPolicy: 192.168.2.3:843
Create Socket: 192.168.2.3:45455
Connect: [Event type="connect" bubbles=false cancelable=false eventPhase=2]
Sending: REG/REGISTER;simon.palmer@gmail.com;Si
Receiving: REG:0/REGISTER:SUCCESS;simon.palmer@gmail.com;Si/
Close: [Event type="close" bubbles=false cancelable=false eventPhase=2]
Error #2048: Security sandbox violation: http://localhost/bst/BasicSocketTest.swf cannot load data from 192.168.2.3:45455.
关闭事件在成功接收到服务器的响应后立即触发,但是错误#2048直到大约20秒后才出现。如果我尝试在关闭后但在错误发生之前发送进一步的消息,Flash Player将抛出一个无效套接字异常

我对这件事有点担心

如果有人感兴趣,我可以提供客户端和服务器的完整源代码。

类似的问题表明localhost没有解决到127.0.0.1


您可以尝试切换到IP地址,看看是否有帮助。

除了yoru crossdomain.xml之外,您还可以在代码中进一步尝试使用安全类

尝试:

或者,如果您是从A许可的主机之外的外部服务器加载:

Security.allowDomain(loader.contentLoaderInfo.url)
然后慢慢地把它打开,直到你碰到错误

确保您可以直接点击策略文件,并且该端口上没有正在运行的块或其他应用程序。通常,当我运行sockets时,我会选择高于5000的值,以确保没有任何东西占用端口。或者尝试几个不同的端口


另外,作为一个简单的检查,请确保您将其命名为crossdomain.xml,并且它都是小写的。我已经让程序员把他们的头发拔了出来,这就是原因。

您是否尝试过从元素添加允许http请求头

<allow-http-request-headers-from domain="*" headers="*" />
<allow-access-from domain="*" to-ports="843,45455" />

或者为allow access from元素指定实际端口而不是*

<allow-http-request-headers-from domain="*" headers="*" />
<allow-access-from domain="*" to-ports="843,45455" />

尝试在xml结束标记“/>”前加一个空格,就像dan_nl建议一样,例如:


别笑了,我刚刚解决了一个与你的问题非常相似的问题(而且它看起来真的像一个解析错误)

。。。这是在Windows Vista上发生的吗?是否将IP地址指定为主机名?如果是,请参阅


或者它可能是在探查器处于活动状态时发生的?如果是这样,请参阅。

发送策略文件时,服务器应始终在策略xml之后发送一个零字节。从上面的描述中不清楚是否发送了零字节,这最终可能会混淆Flash播放器。

这可能对您有帮助,也可能没有帮助,但我们遇到了类似的问题。我们得到了安全错误,但不一致。我构建了前端,并与一位处理用PHP编写的套接字的开发人员一起工作。问题似乎是确实存在一种竞争条件,即Flash在接收策略文件之前会尝试连接到套接字。因此,在前端,我在安全错误处理程序中创建了一个重试,它将在放弃之前运行设置的次数,并将超时时间从默认的20秒设置为6或8秒。它通常会在第二次尝试时出现,这确实有帮助,但有时连接需要8-10秒,而不是最佳解决方案

在我的搜索中发现了一些链接,这一个说了一些关于在服务器上设置延迟的内容,第7篇文章:

最后,我们从这篇Adobe文章中下载并使用了Python策略文件服务器,它一直工作得很好
<allow-access-from domain="*" to-ports="843,45455" />
_in.close();
_out.close();
_socket.close();