为什么Flash Player会在这种情况下抛出沙箱错误?

Sim*_*mon 19 sockets apache-flex flash sandbox

连接到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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

REG/REGISTER;simon;Si
Run Code Online (Sandbox Code Playgroud)

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

REG:0/REGISTER:SUCCESS;simon;Si
Run Code Online (Sandbox Code Playgroud)

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

9 Flash播放器抛出2048沙箱错误,套接字断开连接!这是收到并成功处理邮件之后.实际上它大概是在12秒之后.没有其他工作通过套接字.

我已经尝试通过调用Security.loadPolicyFile()Flex客户端显式加载策略文件,但新玩家安全性的实际情况是它基本上被忽略了.步骤是在发生套接字i/o操作之前不会发送策略请求.此时,玩家总是首先前往端口843寻找主策略文件.如果它找到一个,并且它是允许的,它就不会再进一步​​了.

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

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

有没有人知道为什么会发生这种情况?Flash Player错误?

PS 不要告诉我使用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.
Run Code Online (Sandbox Code Playgroud)

我有一个精简测试客户端,它为每个套接字事件都有一个处理程序,并向屏幕输出一条消息.这就是它所显示的:

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.
Run Code Online (Sandbox Code Playgroud)

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

在Adobe上记录了一个关于此的错误.

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

小智 1

此处的类似问题表明 localhost 未解析为 127.0.0.1。

您可以尝试更改为 IP 地址,看看是否有帮助。