在AS3中如何建立套接字连接

时间:2015-07-21 13:33:05

标签: actionscript-3 sockets

我有一个ServerSocket侦听ServerSocketConnectEvent.CONNECT事件。

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 个答案:

答案 0 :(得分: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将继续执行下一步。如果site-control标记的值为“none”,则进程停止,套接字被拒绝连接。

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

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