flex – 为什么在这种情况下,Flash Player会发生沙盒错误?

前端之家收集整理的这篇文章主要介绍了flex – 为什么在这种情况下,Flash Player会发生沙盒错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
连接到Java(1.5)服务器上的Socket后,我会收到一个Flex 3沙盒错误#2048。服务器代码都是我的,即不在Apache下运行。 Flash Player 10.0 r32。

顺序如下:

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

2由Apache服务的Flex客户端(尽管我从文件系统运行时获得相同的结果),主机上的套接字连接:45455。

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

4我从Java通过端口843提供以下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>

5播放器将以下内容写入调试策略日志…

OK: Root-level SWF loaded: http://localhost/bst/BasicSocketTest.swf
OK: Searching for <allow-access-from> in policy files to authorize data loading from resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf
OK: Policy file accepted: xmlsocket://192.168.2.3:843
OK: Request for resource at xmlsocket://192.168.2.3:45455 by requestor from http://localhost/bst/BasicSocketTest.swf is permitted due to policy file at xmlsocket://192.168.2.3:843

6我使用writeUTFBytes()和flush()(这是我自己的自制消息协议,并在每端完成正确处理),从客户端向端口45455发送短信。

REG/REGISTER;simon;Si

7端口45455上的Java服务器线程侦听响应

REG:0/REGISTER:SUCCESS;simon;Si

8 Flex客户端接收到一个ProgressEvent,并且绑定到套接字的事件侦听器被调用。我处理消息(将其写入屏幕上的文本框)

9 Flash Player会抛出2048个沙盒错误,插座断开!这是收到消息并成功处理之后。其实大约是12秒钟后。没有任何其他工作通过插座。

我已经尝试在Flex客户端中明确加载一个调用Security.loadPolicyFile()的策略文件,但新玩家安全性的现实是基本上被忽略。步骤是在套接字i / o操作发生之前策略请求将不会被发送。此时,播放器始终前往端口843首先查找主策略文件。如果找到一个,它是宽容的,它不再进一步。

我尝试了各种替代方法终止策略文件和策略文件内容包括故意的错误,只是为了看Flash Player是否清醒。

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

有谁有任何线索为什么会发生这种情况? Flash Player bug?

附:请不要告诉我使用BlazeDS或LCDS或者Granite,或者别的东西作为服务器,我正在寻找解决这个问题的方法,而不是重新设计。请不要让我使用XMLSocket,而是尝试并得到完全相同的结果。我选择了我的架构仔细和故意,我想要一个二进制插槽。

编辑
为了回应詹姆斯·沃德在他的评论中的要求,这里是整个错误消息:

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.

在成功接收到服务器的响应后,关闭事件将立即触发,但是在大约20秒之后,错误#2048才会出现。如果我在关闭后尝试发送另一个消息,但在错误之前,Flash Player会引发一个无效的套接字异常。

我有这个logged a bug at Adobe

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

解决方法

我一直在本地进行测试,一切似乎都正常工作,直到套接关闭。插座不应该闭合吗?消息发送到Flex客户端后,Java代码可以:
_in.close();
_out.close();
_socket.close();

然后,Flex客户端下次尝试与套接字通信时,会收到沙盒违规。如果再次创建新的套接字连接,则发送和接收工作正常,然后关闭。但是在一分钟之后,我又遇到了沙盒违例。我想知道Flash是否正在尝试ping套接字,并且由于它关闭它会引发沙盒违规?

猜你在找的Flex相关文章