Flash10-ActionScript3:无法连接到套接字服务器

时间:2013-08-09 06:54:00

标签: flash sockets actionscript

我写过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事件永远不会被触发。

提前感谢您的帮助!

1 个答案:

答案 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_ERRORIOErrorEvent.IO_ERROREvent.CLOSEProgressEvent.SOCKET_DATA)。