2015-07-21 45 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