我有一个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();
}
调用代码但它不起作用。我如何建立连接?
请帮助:)
答案 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仍无法找到授予权限的策略文件,则拒绝套接字连接。