如果连接失败,可那是下面两种原因的一种:一种是连接立即失败和运行时错误,另一种是如果无法完成连接从而产生一个ioError或者securityError事件.关于错误事件处理信息的描述,我们打算改日讨论.
请牢记,当与一个主机建立一个Socket连接时,Flash Player要遵守如下安全沙箱规则.
1.Flash的.swf文件和主机必须严格的在同一个域名,只有这样才可以成功建立连接.
2.一个从网上发布的.swf文件是不可以访问本地服务器的.
3.本地未通过认证的.swf文件是不可以访问任何网络资源的.
4.你想跨域访问或者连接低于1024的端口,必须使用一个跨域策略文件.
如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会产生一个securityError事件.这些情况都可以通过使用一个跨域策略文件解决.
在Adobe Flash Player升级到9.0.124后,由于安全策略的更改,使得在socket或xmlsocket的应用里,原先如用http方式加载安全策略的手段不能继续使用了,类似此类应用必须使用xmlsocket://方式来提供安全策略。flashplayer的安全策略检测过程如下:
1,首先检测目标服务器的843端口是否提供安全策略
2,如果1没有检测到策略,则检测actionscript是否使用了Security.loadPolicyFile(xmlsocket://) 手段提供安全策略,如果还没检测到,则使用第3步检测
3,检测目标服务器目标端口是否提供安全策略
如果上述检测都不成功,则socket或xmlsocket则拒绝连接目标服务器。
这就是说,现在我们还必须为应用提供一个提供安全策略的socket服务,正好,adobe开发人员提供了这样一个小工具,本人测试过,能使用。
具体内容请看:http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
请使用了socket 或xmlsocket的开发者尽早更换安全策略提供方式吧,否则新版flashplay用户就该不能正常使用你的应用了。
===============================================================
flash cs3 中文帮助中的说明
连接到套接字
默认情况下,禁用对套接字和 XML 套接字连接的跨域访问。此外,默认情况下还禁止访问与低于 1024 的端口上的 SWF 文件位于同一个域的套接字连接,但可以通过提供以下任一位置中的跨域策略文件来允许访问这些端口:
与主套接字连接相同的端口
不同端口
与套接字服务器位于同一个域的 HTTP 服务器的端口 80 上
如果提供的跨域策略文件与主套接字连接位于同一端口,或者位于不同端口,则通过在跨域策略文件中使用 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>
要检索与主套接字连接位于相同端口中的套接字策略文件,只需调用 Socket.connect() 或 XMLSocket.connect() 方法;并且,如果指定的域与执行调用的 SWF 文件所在的域不同,Flash Player 将自动尝试从正在尝试的主连接所在的相同端口中检索策略文件。要从与主连接位于同一服务器上的不同端口检索套接字策略文件,需使用特殊的"xmlsocket"语法调用 Security.loadPolicyFile() 方法,如下所示:
Security.loadPolicyFile("xmlsocket://server.com:2525");
先调用 Security.loadPolicyFile() 方法,然后再调用 Socket.connect() 或 XMLSocket.connect() 方法。Flash Player 随后将一直等待完成策略文件请求,之后再决定是否允许主连接。
如果要实现套接字服务器,并且需要提供套接字策略文件,则应决定是使用接受主连接的同一端口提供策略文件,还是使用不同的端口来提供策略文件。无论是哪种情况,服务器均必须等待客户端的第一次传输之后再决定是发送策略文件还是建立主连接。当 Flash Player 请求策略文件时,它始终会在建立连接后传输以下字符串:
<policy-file-request/>
服务器收到此字符串后,即会传输该策略文件。程序对于策略文件请求和主连接并不会使用同一连接,因此应在传输策略文件后关闭连接。如果不关闭连接,Flash Player 将关闭策略文件连接,之后重新连接以建立主连接。
有关详细信息,请参阅套接字策略文件。
套接字策略文件
ActionScript 对象可实例化两种不同的服务器连接:基于文档的服务器连接和套接字连接。Loader、Sound、URLLoader 和 URLStream 等 ActionScript 对象可实例化基于文档的服务器连接,这些对象均根据 URL 加载文件。ActionScript Socket 和 XMLSocket 对象进行套接字连接,这些对象操作的是数据流而非加载的文档。Flash Player 支持两种策略文件:基于文档的策略文件和套接字策略文件。基于文档的连接需要基于文档的策略文件,套接字连接则需要套接字策略文件。
Flash Player 要求使用尝试连接希望使用的同类协议传输策略文件。例如,如果将策略文件放置在您的 HTTP 服务器上,则允许其它域中的 SWF 文件从该服务器(作为 HTTP 服务器)加载数据。但是,如果在这台服务器上未提供套接字策略文件,则禁止其它域的 SWF 文件在套接字级别连接到该服务器。检索套接字策略文件的方法必须与连接方法相匹配。
由套接字服务器提供的策略文件具有与任何其它策略文件相同的语法,只是前者还必须指定要对哪些端口授予访问权限。如果策略文件来自低于 1024 的端口号,则它可以对任何端口授予访问权限;如果策略文件来自 1024 或更高的端口,则它只能对 1024 端口和更高的端口授予访问权限。允许的端口在 <allow-access-from> 标签的 to-ports 属性中指定。单个端口号、端口范围和通配符都是允许值。
下面是一个 XMLSocket 策略文件示例:
<cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example2.com" to-ports="516-523" /> <allow-access-from domain="www.example2.com" to-ports="507,516-523" /> <allow-access-from domain="www.example3.com" to-ports="*" /> </cross-domain-policy>
在 Flash Player 6 中首次引入策略文件时,并不支持套接字策略文件。与套接字服务器的连接由跨域策略文件所在默认位置中的一个策略文件授权,跨域策略文件位于与套接字服务器位于同一个域中的 HTTP 服务器的端口 80 上。为尽可能保留现有的服务器排列,Flash Player 9 仍然支持此功能。但是,Flash Player 现在的默认设置是在与套接字连接相同的端口上检索套接字策略文件。如果希望使用基于 HTTP 的策略文件来授权套接字连接,则必须使用如下所示代码显式请求 HTTP 策略文件:
Security.loadPolicyFile("http://socketServerHost.com/crossdomain.xml")
此外,为授权套接字连接,HTTP 策略文件只能来自跨域策略文件的默认位置,而非来自任何其它 HTTP 位置。从 HTTP 服务器获取的策略文件隐式向 1024 和所有更高端口授予套接字访问权限;HTTP 策略文件中的任何 to-ports 属性均被忽略。