连接到 Java (1.5) 服务器上的 Socket 后,我收到 Flex 3 沙盒错误 #2048。服务器代码都是我的,即不在 Apache 下运行。Flash 播放器 10.0 r32。
顺序如下...
1 Java 服务器启动,在端口 843 上侦听策略文件请求,在端口 45455 上侦听我的其他请求。
2 由 Apache 提供的 Flex 客户端(尽管如果我从文件系统运行它会得到相同的结果),在主机上建立了套接字连接:45455。
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>
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
writeUTFBytes()
6 我使用和flush()
(这是我自己的自制消息协议,并且在每一端都正确处理)在端口 45455 上将文本消息从客户端发送到服务器
REG/REGISTER;simon;Si
7 侦听端口 45455 的 Java 服务器线程响应
REG:0/REGISTER:SUCCESS;simon;Si
8 Flex 客户端收到一个 ProgressEvent 并且我绑定到套接字的事件侦听器被调用。我处理消息(将其写入屏幕上的文本框)
9 Flash播放器抛出2048沙盒错误,socket断开!这是在成功接收和处理消息之后。事实上,大约是 12 秒后。没有其他东西通过套接字起作用。
我已经尝试Security.loadPolicyFile()
在 Flex 客户端中通过调用显式加载策略文件,但新播放器安全性的现实是它基本上被忽略了。这些步骤是在发生套接字 i/o 操作之前不会发送策略请求。此时播放器总是首先去端口 843 寻找主策略文件。如果它找到了一个,并且它是允许的,它就不会再进一步了。
我尝试了多种终止策略文件和策略文件内容的替代方法,包括故意错误以查看 Flash Player 是否处于唤醒状态。
我看不出为什么我会抛出 2048。我在指定的主安全端口上准确地提供了一个套接字策略文件,播放器本身将其记录为正确的。然后套接字成功地从服务器发送和接收一条消息,其内容可用于我的代码。
有谁知道为什么会发生这种情况?Flash 播放器错误?
PS 请不要告诉我使用 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 会引发无效的套接字异常。
我在 Adobe 上记录了一个关于此的错误。
如果有人感兴趣,我可以提供客户端和服务器的完整源代码。