Flash Socket跨域的核心在于服务端正确部署 crossdomain.xml 策略文件,否则客户端连接会被浏览器安全沙箱直接拦截,无法建立 Socket 通信。
Flash Socket 跨域的工作原理
Flash Socket 跨域的本质是浏览器安全沙箱对 Socket 连接的限制,当一个 Flash 应用尝试连接一个非源域的服务器端口时,Flash Player 会先向目标服务器请求策略文件,确认该域名是否被授权访问,如果策略文件缺失或配置错误,连接会被拒绝。
Socket 连接与策略文件加载流程
- Flash 应用发起 Socket 连接请求,目标地址为
host:port。 - Flash Player 首先向目标主机的 843 端口 发送
<policy-file-request/>请求,试图获取全局策略文件。 - 若 843 端口无响应,Flash Player 会转而向目标连接端口再次发送同样的请求,超时时间通常为 3 秒。
- 服务端必须返回符合 XML 格式的
crossdomain.xml内容,包含<allow-access-from>等授权标签。 - Flash Player 解析策略文件,若允许访问,则建立 Socket 连接;否则抛出安全错误。
策略文件的关键配置项
<allow-access-from domain="" to-ports="" />:允许所有域访问所有端口,生产环境慎用。<allow-http-request-headers-from domain="" headers="" />:控制 HTTP 请求头传递,直接影响跨域请求的完整性。secure属性:标记是否仅允许 HTTPS 源发起连接,默认false,当使用 HTTPS 时建议设为true。
Flash Socket 跨域失败常见原因分析
多数情况下,跨域失败并不是 Flash 本身的问题,而是服务端配置遗漏或理解偏差。
策略文件部署位置误区
很多开发者只把 crossdomain.xml 放在 Web 服务器根目录,却忽略了 Socket 服务器也需要响应策略请求。Flash Player 优先检查的是 Socket 连接目标端口上的策略响应,而不是 Web 服务器的 HTTP 路径,Socket 服务器不处理 <policy-file-request/>,即使 Web 根目录有策略文件也无济于事。
格式与语法错误
- 策略文件必须是 UTF-8 编码,无 BOM 头。
- XML 标签严格区分大小写,
<allow-access-from>不能写成<AllowAccessFrom>。 - 通配符 只能用于域名或端口字段,不能出现在
to-ports属性中的范围书写以外,to-ports="1000-2000"正确,to-ports=""也允许,但to-ports="1000,2000"不被支持,需用空格分隔。
缓存与超时影响
Flash Player 会对策略文件进行缓存,默认有效期 24 小时,修改策略文件后,建议在测试时使用 connect() 之前调用 Security.loadPolicyFile() 强制刷新,服务端响应策略文件的速度如果超过 3 秒,可能被 Flash Player 视为无响应,导致连接超时。
Flash Socket 跨域配置实操步骤
以下是一个实际游戏服务器使用 Socket 跨域的标准配置流程,以 Python 为例,其他语言原理相同。
编写 crossdomain.xml
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain=".example.com" to-ports="8080,8081" />
<allow-access-from domain=".yourdomain.cn" to-ports="1024-9999" />
</cross-domain-policy>
注意:域名尽量使用具体二级域名,避免使用 通配符,尤其当服务涉及敏感数据时。
在 Socket 服务器中嵌入策略文件响应
在 Socket 服务器启动时,监听主连接端口,并在收到 <policy-file-request/> 时立即返回上述 XML 内容,关键代码逻辑:
- 接收客户端发来的数据,判断是否为
<policy-file-request/>。 - 如果是,则发送完整的
crossdomain.xml字符串,并以空字符


