顺序如下:
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会引发一个无效的套接字异常。
如果任何人有兴趣,我可以提供客户端和服务器的完整源代码。