4

我有一个使用 Flash 二进制 (TCP) 套接字与 Java 服务器通信的 Flex 客户端。我有一个 localhost (Apache) 服务器,它提供了一个 crossdomain.xml 文件,它在我测试时是完全开放的。

我的代码在启动时成功加载了策略文件。

然后我毫不费力地将套接字连接到服务器并发送消息并获得响应。到目前为止一切都很好。

但是,当我通过同一个套接字发送第二条消息时,我会暂停大约 12 秒,然后出现沙盒违规错误:

Security Error: Error #2048: Security sandbox violation: file:///C:/apache_root/ttt1/ttt1.swf cannot load data from localhost:45455.

这与第一条消息成功通过的端口和套接字相同。

我尝试在每次发送之前重新加载策略文件,但我得到了相同的结果。

知道为什么会发生这种情况吗?我显然有一个打开的套接字。我在每次发送后刷新套接字,并且在每次读取后我也尝试这样做,但结果相同。

提前致谢

编辑:
如果我在每次调用之前重新创建套接字,我的代码就可以工作。我很难相信这是正确的,但也许我缺少一个 Socket 设置。

4

4 回答 4

1

As far as I know if you're doing binary sockets the crossdomain.xml is not loaded via http.

Have you checked your apache's access logs if the crossdomain is even queried?

You might get connection from flash via tcp from flash asking for the file on your java server (not using http. It just sends the string "" or similar). Look out for them. If you don't answer them within 3 seconds (or so) flash throws an sandbox violation.

于 2011-01-30T00:14:05.073 回答
1

当你想建立一个套接字连接时,你要做的第一件事就是加载策略文件。每次加载 SWF 只需执行一次。

Security.allowDomain(host);
Security.loadPolicyFile("xmlsocket://"+host+":"+port);

该请求将在分配的端口(在您的情况下为 45455)上发出,您的服务器将不得不在该端口上侦听"<policy-file-request/>"没有引号的请求。找到该请求后,您需要将带有节点的 crossdomain.xml 返回给客户端<allow-access-from domain="*" to-ports="*" />

发送跨域后,您需要关闭服务器端的套接字。在客户端,您需要忽略域响应,因为 Flex 会处理该响应,但此时您可以重新连接到套接字服务器。此时您可以进行数据发送/接收。

我有一种感觉,它实际上对您有用的原因是因为您在超时之前使用策略文件的连接来传输您的数据。

我建议阅读新风格的跨域策略,并阅读您用于套接字服务器的协议

于 2011-03-10T23:20:04.797 回答
0

我认为这取决于您在 swf 的编译过程中使用的沙箱策略,而不是您的 crossdomain.xml ......也许这个文档可以帮助您:安全沙箱

但我不是 100% 确定

于 2009-11-04T11:50:26.183 回答
0

这种听起来像是缓存问题。也许您将第一个套接字连接从缓存中拉出,而第二个连接被拒绝,因为它从服务器获得了 200。

您可能希望将 localhost 添加到您的闪存安全例外列表中以进行调试。这将消除沙盒错误,直到您将作品放到其生产环境中。

于 2009-12-23T13:56:47.143 回答