我正在尝试在 Flash 中设置一个二进制套接字连接到服务器,而不是提供 swf 的服务器。按照 Adobe 关于套接字策略文件的文档,我从目标服务器的 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 字符串之后发送的空字节,并且我还使用 Adobe 的示例策略文件服务器进行了尝试,结果相同。