第二个套接字上的沙箱违规发送

时间:2009-11-04 11:44:30

标签: flex sockets flex3 sandbox

我有一个使用Flash二进制(TCP)套接字的Flex客户端与Java服务器进行通信。我有一个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 个答案:

答案 0 :(得分:1)

据我所知,如果您正在使用二进制套接字,则不会通过http加载crossdomain.xml。

如果甚至查询了跨域,您是否检查过apache的访问日志?

您可能会通过tcp从闪存中获取闪存请求java服务器上的文件(不使用http。它只是发送字符串“”或类似的)。留意他们。如果你在3秒内(或左右)没有回答它们,则闪存会引发沙箱违规。

答案 1 :(得分:1)

要进行套接字连接时,首先要做的是加载策略文件。这只需要在每次加载SWF时完成一次。

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

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

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

我觉得它实际上对你有用的原因是因为你使用策略文件的连接在超时之前传输数据。

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

答案 2 :(得分:0)

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

但我不是百分百肯定

答案 3 :(得分:0)

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

您可能希望将localhost添加到Flash安全例外列表以进行调试。这将使沙盒错误变得安静,直到你的作品生产环境为止。