默认情况下,运行时查找端口 843 提供的套接字策略文件。和 URL 策略文件一样,此文件称为“主策略文件”。
在 Flash Player 6 中首次引入策略文件时,并不支持套接字策略文件。与套接字服务器的连接由默认位置中的一个策略文件授权,该默认位置是套接字服务器所在主机的 HTTP 服务器的端口 80。Flash Player 9 仍支持此功能,但 Flash Player 10 不再支持。在 Flash Player 10 中,只有套接字策略文件可授权套接字连接。
与 URL 策略文件类似,套接字策略文件支持元策略语句(用于指定可提供策略文件的端口)。但是,套接字策略文件的默认元策略不是“master-only”而是“all”。即,除非主策略文件指定更具限制性的设置,否则 Flash Player 假定主机上的任意套接字均可提供套接字策略文件。
默认情况下禁止访问套接字和 XML 套接字连接,即使所要连接的套接字与 SWF 文件位于同一个域中也是如此。可以从下列任意位置提供套接字策略文件,从而允许套接字级别访问:
-
端口 843(主策略文件的位置)
-
与主套接字连接相同的端口
-
主套接字连接端口之外的端口
默认情况下,Flash Player 在端口 843 和主套接字连接所在的端口上查找套接字策略文件。如果要从其他端口提供套接字策略文件,SWF 文件必须调用
Security.loadPolicyFile()
。
套接字策略文件具有与 URL 策略文件相同的语法,只是前者还必须指定要对哪些端口授予访问权限。如果套接字策略文件来自低于 1024 的端口号,则它可以对任何端口授予访问权限;如果策略文件来自 1024 或更高的端口,则它只能对 1024 端口和更高的端口授予访问权限。允许的端口在
<allow-access-from>
标签中的
to-ports
属性中指定。单个端口号、端口范围和通配符都是允许值。
下面是套接字策略文件的示例:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy>
要从端口 843 或主套接字连接所在的端口上检索套接字策略文件,请调用
Socket.connect()
或
XMLSocket.connect()
方法。Flash Player 首先在端口 843 上检查是否有主策略文件。如果找到主策略文件,Flash Player 将检查该文件是否含有在目标端口上禁止套接字策略文件的元策略语句。如果未禁止访问,Flash Player 首先在主策略文件中查找适当的
allow-access-from
语句。如果找不到主策略文件,Flash Player 将从主套接字连接所在的端口上查找套接字策略文件。
要从其他位置检索套接字策略文件,请首先调用
Security.loadPolicyFile()
方法,调用时使用特殊的
"xmlsocket"
语法,如下所示:
Security.loadPolicyFile("xmlsocket://server.com:2525");
先调用
Security.loadPolicyFile()
方法,然后再调用
Socket.connect()
或
XMLSocket.connect()
方法。Flash Player 随后将一直等待完成策略文件请求,之后再决定是否允许主连接。但是,如果主策略文件指定目标位置不能提供策略文件,则调用
loadPolicyFile()
无效,即使该位置有策略文件。
如果要实现套接字服务器,并且需要提供套接字策略文件,则应决定是使用接受主连接的同一端口提供策略文件,还是使用不同的端口来提供策略文件。无论是哪种情况,服务器都必须等到客户端的第一次传输收到之后才能发送响应。
当 Flash Player 请求策略文件时,它始终会在建立连接后传输以下字符串:
<policy-file-request/>
服务器收到此字符串后,即会传输该策略文件。来自 Flash Player 的请求始终由 null 字节终止,来自服务器的响应也必须由 null 字节终止。
程序对于策略文件请求和主连接并不会使用同一连接,因此请在传输策略文件后关闭连接。如果不关闭连接,Flash Player 将关闭策略文件连接,之后重新连接以建立主连接。