2015-07-21 38 views
0

我有一个ServerSocket侦听ServerSocketConnectEvent.CONNECT事件。在AS3中如何进行套接字连接

serverSocket.bind(80, "127.0.0.1"); 
serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect); 
serverSocket.listen(); 

然后它监听ProgressEvent.SOCKET_DATA事件。

private function onConnect(event:ServerSocketConnectEvent):void 
{ 
    clientSocket = event.socket; 
    clientSocket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketData); 
} 

private function onClientSocketData(event:ProgressEvent):void 
{ 
    var buffer:ByteArray = new ByteArray(); 
    clientSocket.readBytes(buffer, 0, clientSocket.bytesAvailable); 
... 

然后我从我的客户端发送一条简单的消息“hello”。 这工作正常,当我从IDE运行我的客户端。 但是当我运行相同的客户从我的浏览器的SWF我在缓冲区得到这个消息:

""<policy-file-request/>"" 

我试图捕捉的代码是这样回应:

if(buffer.toString().search("policy-file-request" != -1)) 
{ 
    var str:String = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0"; 
    clientSocket.writeUTFBytes(str); 
    clientSocket.flush(); 
} 

代码叫,但它不起作用。我如何建立连接?

请帮助:)

回答

1

您需要定义一个套接字策略和服务是XML文件到Flash的要求,即

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> 
<!-- Policy file for xmlsocket://socks.example.com --> 
<cross-domain-policy> 
    <!-- This is a master-policy file --> 
    <site-control permitted-cross-domain-policies="master-only"/> 
    <!-- Instead of setting to-ports="*", 
administrators can use ranges and commas --> 
    <!-- This will allow access to ports 123, 456, 457, and 458 --> 
    <allow-access-from domain="swf.example.com" to-ports="123,456-458" /> 
</cross-domain-policy>  

随着引进的Adobe Flash Player 9,0,124的, 0,则Flash Player 将不会直接向服务器建立套接字连接,而不会首先从该服务器获得明确许可 。这将需要一些 系统和网络来打开端口或运行新的服务,以便 支持授予许可。在现有的政策和服务器设置的

全样本: http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html

则Flash Player将在三个地方为每个IP连接套接字策略文件。检查按以下顺序进行:

  • Flash Player首先检查端口843以确定是否存在套接字主策略文件。如果没有套接字主策略文件或套接字主策略文件具有指定“全部”的站点控制标记,则Flash Player继续执行下一步。如果站点控制标记的值为“无”,则该过程停止并且套接字被拒绝连接。

  • 如果SWF文件中存在一个ActionScript对Security.loadPolicyFile()命令,则Flash Player运行时检查该位置。只有在检查了端口843上的主策略文件以确认其他策略文件的权限后,Flash Player才会检查loadPolicyFile()的目标。如果开发人员未指定loadPolicyFile()命令,则Flash Player会检查连接的目标端口。

  • 连接的目的端口是由Flash Player的最后一次检查。此检查仅在套接字主策略文件允许Flash Player检查其他位置时执行。如果Flash Player仍然无法找到授予权限的策略文件,则套接字连接被拒绝。

+0

谢谢@RobertN :) 正如你可以从代码中看到的,我试图发送我的XML。但它不起作用。你能提供一些代码吗? –

+0

对于开发工作,我只是使用Adobe的python flashpolicyd.py脚本进行生产,我们为端口843站起虚拟http服务器,并用策略文件回复任何请求。如果您使用基于Air的服务器(?)执行此操作,请尝试将\ 0终止符作为writeByte(0)发送。 – SushiHangover