2010-05-17 50 views
0

我試圖評估Flex是否可以訪問二進制套接字。似乎有一個類調用Socket(flex.net包)。要求是Flex將連接到服務器提供二進制數據。然後它將訂閱數據並接收它將解釋並顯示爲圖表的訂閱源。我從來沒有與Flex合作過,我的經驗在於Java,所以對我來說一切都是新的。所以我試圖快速設置一些簡單的東西。 Java服務器期望以下內容:Flex中的二進制套接字和策略文件

DataInputStream in = ..... 
byte cmd = in.readByte(); 
int size = in.readByte(); 
byte[] buf = new byte[size]; 
in.readFully(buf); 
... do some stuff and send binary data in something like 
out.writeByte(1); 
out.writeInt(10000); 
... etc... 

Flex,需要連接到本地主機:6666完成握手並讀取數據。我有這樣的事情:

 try { 
      var socket:Socket = new Socket(); 

      socket.connect('192.168.110.1', 9999); 
      Alert.show('Connected.'); 
      socket.writeByte(108); // 'l' 
      socket.writeByte(115); // 's' 
      socket.writeByte(4); 
      socket.writeMultiByte('HHHH', 'ISO-8859-1'); 
      socket.flush(); 
     } catch (err:Error) { 
      Alert.show(err.message + ": " + err.toString()); 
     } 

首先,Flex做了<policy-file-request/>。我修改了服務器以迴應:

<?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="192.168.110.1" to-ports="*" /> 
</cross-domain-policy>  

之後 - EOFException發生在服務器上,就是這樣。

所以問題是,我接觸到Flex的整個流數據問題是錯誤的嗎?我是否發送政策文件錯誤?不幸的是,我似乎無法找到一個很好的例子來說明如何去做。在我看來,Flex可以執行二進制Client-Server應用程序,但我個人缺乏一些基本知識。

我在IntelliJ IDEA IDE中使用Flex 3.5。

任何幫助表示讚賞。

謝謝!

回答

1

我可以確認Flex可以訪問二進制套接字。但是,你已經看到了一個煩惱。它將首先嚐試連接到主機上的端口843以獲取策略文件並查看是否允許連接。但是,如果連接超時(並且它只允許3秒鐘獲得答案),它將連接到服務器端口並請求策略文件(通過發送<策略文件請求/ >)。它讀取結果,並且如果連接被認爲是可接受的,則它再次連接到服務器以經歷「真實」協議。

除非843上的策略文件服務器保證快速響應,否則Flex應用程序總是會在服務器端口上發出策略文件請求。這對於現有服務來說是一個真正的部署問題,但是如果您自己設置服務器,則不會那麼糟糕,在這種情況下,您只需確保可以將策略文件請求與協議的任何初始啓動進行合理區分。

我已經發回策略文件看起來是這樣的:

<?xml-version="1.0"?> 
<cross-domain-policy> 
    <allow-access-from domain="*" to-ports="1492"/> 
</cross-domain-policy> 

你看起來八九不離十保存對站點控制標籤,我不認爲這是相關的。

什麼是非常有用的是啓用策略文件請求的日誌記錄,您可以瞭解Flex是什麼。以下是我在Vista機器上的操作方法;路徑在XP下會有所不同,但我希望至少這個描述能爲你提供網頁搜索條件。

首先,安裝Flash播放器的調試版本。

通過將啓用日誌記錄:

ErrorReportingEnable=1 
TraceOutputFileEnable=1 
PolicyFileLog=1 
#PolicyFileLogAppend=1 # optional but possibly useful 

在C:/Users/George/mm.cfg

現在你應該看到兩個文件出現在C:\用戶\喬治\應用程序數據\漫遊\的Macromedia \ Flash播放器\日誌「:

flashlog.txt 
policyfiles.txt 

policyfiles.txt是你想看看,看看什麼樣的政策文件,被檢索和Flex決定如何迴應他們的一個的flashlog.txt是非常有用的,太。 ,因爲捕獲trace()輸出,但是您可能會從IDE獲得該輸出。

還有一件事。將事件偵聽器添加到套接字對於幫助區分I/O類型錯誤與安全策略違例非常有用。以下是我正在偵聽的事件:

socket.addEventListener(Event.CONNECT, ServerConnect); 
socket.addEventListener(Event.CLOSE, ServerClose); 
socket.addEventListener(IOErrorEvent.IO_ERROR, ServerIOError); 
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError); 
+0

您可以在使用Security.loadPolicyFile方法加載策略文件時指定端口。我在這裏寫了一篇文章http://cornelcreanga.com/2008/11/bringing-data-into-flex-applications-introduction/ – 2010-05-17 18:28:42

+0

謝謝!這工作。它連接好。現在我要弄清楚如何在Flex中讀取異步套接字中的數據。 Flex有免費的實時消息協議嗎?我看到他們提供了一個商業解決方案,但我可以以某種方式免費做到這一點嗎? – Daniil 2010-05-17 19:08:56