在连接到一个运行在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 我通过端口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()
和flush()
在端口45455上从客户端向服务器发送文本消息(这是我自己开发的消息协议,并且在每个端点都正确处理)。
REG/REGISTER;simon;Si
监听端口45455的7个Java服务器线程回复:
REG:0/REGISTER:SUCCESS;simon;Si
Flex客户端收到ProgressEvent事件并调用绑定到套接字的事件侦听器。我处理消息(将其写入屏幕上的文本框)。Flash播放器抛出2048沙箱错误并断开套接字连接!这是在成功接收和处理消息后发生的。事实上,它大约是12秒后。没有其他的套接字操作能够执行。
我尝试了在Flex客户端中显式加载策略文件,使用
Security.loadPolicyFile()
进行调用,但新的播放器安全性实际上被忽略了。步骤是,直到发生套接字I / O操作,策略请求才会发送。此时,播放器总是首先访问843端口,以寻找主策略文件。如果找到一个策略文件,并且它是允许的,它就不再继续执行。我尝试过各种替代方案来终止策略文件和策略文件内容,包括故意制造错误,只是为了看看Flash Player是否清醒。
我看不出为什么会抛出2048。我在指定的主安全端口上准确地提供了套接字策略文件,播放器本身将其记录为正确。然后,套接字成功地从服务器发送和接收一条消息,其内容对我的代码可用。
有人知道为什么会发生这种情况吗?Flash Player的错误?
P.S. 请不要告诉我使用BlazeDS或LCDS或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.
成功从服务器接收到响应后,立即触发close事件,但是错误#2048要等大约20秒才会出现。如果在关闭之后但在错误之前尝试发送进一步的消息,则Flash Player会抛出无效套接字异常。
我已经在Adobe上记录了一个错误。
如果有人感兴趣,我可以提供客户端和服务器的完整源代码。