我写过C#代码已在本地服务器端运行。
System.Net.Sockets.Socket server = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
server.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Any, 4502));
server.Listen(int.MaxValue);
while (true)
{
System.Net.Sockets.Socket client = server.Accept();
if (client.Connected)
client.Send(new byte[1]);
}
然后在本地网页上构建了一个嵌入在html文件中的swf文件 - 127.0.0.1 / Socket.htm
public class WebSocket extends flash.display.Sprite
{
private var Socket:flash.net.Socket = new flash.net.Socket();
public function WebSocket()
{
flash.system.Security.allowDomain("*");
flash.system.Security.allowInsecureDomain("*");
flash.system.Security.loadPolicyFile("PolicyFile.xml");
this.Socket.addEventListener( flash.events.Event.CONNECT, Socket_Connect );
this.Socket.connect("127.0.0.1",4502);
}
private function Socket_Connect(event:Event):void
{
this.MyLabel.text= "The socket is now connected..." ;
}
}
这是“127.0.0.1/PolicyFile.xml”的内容:
<?xml version="1.0" encoding="utf-8"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
代码运行时没有任何错误,但CONNECT事件永远不会被触发。
提前感谢您的帮助!
答案 0 :(得分:0)
来自Flash的套接字连接需要由同一主机提供服务的策略文件。 Flash Player会自动尝试与目标计算机上的端口843建立套接字连接以获取策略文件。使用普通请求加载策略文件是不够的。
您可以指定不同的端口:
Security.loadPolicyFile("xmlsocket://127.0.0.1:1843");
由于您似乎使用.NET,因此这是您平台的策略服务器:http://policyserver.codeplex.com。
您也可以自己实施策略服务器。只需监听连接和输入字符串<policy-file-request/>\0
。之后,输出XML并关闭套接字。然后,Flash Player将继续建立连接。
示例策略XML:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*" to-ports="4502" />
</cross-domain-policy>
另请确保您收听套接字上的所有相关事件(即SecurityErrorEvent.SECURITY_ERROR
,IOErrorEvent.IO_ERROR
,Event.CLOSE
,ProgressEvent.SOCKET_DATA
)。