0

我写的 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 事件。

感谢您提前提供任何帮助!

4

1 回答 1

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)。

于 2013-08-13T09:45:35.647 回答