4

我正在尝试在 Flash 中设置一个二进制套接字连接到服务器,而不是提供 swf 的服务器。按照 Adob​​e 关于套接字策略文件的文档,我从目标服务器的 843 端口提供此文件:

<!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="6666" />  
</cross-domain-policy>

然后我使用以下 AS3 代码连接到 6666 端口:

sock.addEventListener(Event.CLOSE, closeHandler);
sock.addEventListener(Event.CONNECT, connectHandler);
sock.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
sock.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
sock.connect('myserver', 6666);

这完美地工作。但是当我尝试从 843 以外的端口提供策略文件时,事情变得很糟糕。如果我将策略文件服务器设置为在端口 6669 上侦听,并在尝试连接之前更改我的 Flash 代码添加此调用:

Security.loadPolicyFile("xmlsocket://myserver:6669");

..那么连接将只工作大约一半的时间,如果没有,我会收到安全错误#2048。我已经检查了这些情况,策略文件服务器甚至没有收到来自客户端的返回 xml 文件的请求。

从 843 或 6669 提供服务时,服务器代码完全相同。我检查了在 xml 字符串之后发送的空字节,并且我还使用 Adob​​e 的示例策略文件服务器进行了尝试,结果相同。

4

1 回答 1

1

使用网络分析工具后,我找到了答案:结果 Flash 不会关闭从失败请求到 843 的套接字,即使在 3 秒超时之后也是如此。

套接字需要几秒钟才能完全关闭。如果您在此期间尝试重新建立连接,即使您使用不同的浏览器窗口,它也会失败。

于 2012-06-12T12:13:20.877 回答