2013-07-16 89 views
0

我有一個C程序並運行一個Web服務器。我有一個空氣應用程序,我想用Air Application與該Web服務器通信。我創建一個套接字對象並執行以下操作。與C應用程序的Http通信

public function httpTest():void 
    {  
     sock.addEventListener(Event.CONNECT, onConnect); 
     sock.addEventListener(ProgressEvent.SOCKET_DATA, onDataRecv); 
     sock.addEventListener(IOErrorEvent.IO_ERROR, onError); 
     try 
     { 
     trace("Connecting..."); 
     sock.connect("127.0.0.1", 9800);    
     sock.writeMultiByte("GET /Connection?data=version", "us-ascii"); 
     sock.flush(); 
     } 
     catch(err:Error) 
     { 
     trace(err.message); 
     } 
    } 

    public function onConnect(event:Event):void 
    { 
     trace("onConnect +"); 
    } 

    public function onDataRecv(event:ProgressEvent):void 
    { 
     trace("onDataRecv +"); 
    } 

    public function onError(event:Event):void 
    { 
     trace("onError +"); 
    } 

套接字連接成功並且其連接事件被觸發。但是當我嘗試請求連接url時,服務器端沒有收到任何內容。我錯過了什麼。由於

+0

我不明白「請求連接URL」是什麼意思在這個contenxt;也不知道你的代碼是做什麼的。 – JeffryHouser

+0

我在本地主機連接。這是成功的。但是當我嘗試請求別的東西時。這是行不通的。當我從網絡瀏覽器嘗試相同的URL時,它工作正常。像「http://127.0.0.1:9800/Connection?data=version」 –

+0

「不行」是什麼意思。你能量化嗎?你有運行時錯誤嗎?還是編譯時間錯誤?或者是其他東西? onError方法是否執行?如果是這樣;細節是什麼? – JeffryHouser

回答

0

我犯了一個錯誤。我沒有在Get String中添加HTTP版本和字符串終止符。這就是爲什麼我沒有收到任何打印在服務器端。因爲請求無效。我發佈了工作代碼。感謝幫助。

public function httpTest():void 
    {  
     sock.addEventListener(Event.CONNECT, onConnect); 
     sock.addEventListener(ProgressEvent.SOCKET_DATA, onDataRecv); 
     sock.addEventListener(IOErrorEvent.IO_ERROR, onError); 
     try 
     { 
     trace("Connecting..."); 
     sock.connect("127.0.0.1", 9800);    
     sock.writeMultiByte("GET /Connection?data=version HTTP/1.0\r\n\r\n", "us-ascii"); 
     sock.flush(); 
     } 
     catch(err:Error) 
     { 
     trace(err.message); 
     } 
    } 

    public function onConnect(event:Event):void 
    { 
     trace("onConnect +"); 
    } 

    public function onDataRecv(event:ProgressEvent):void 
    { 
     trace("onDataRecv +"); 
    } 

    public function onError(event:Event):void 
    { 
     trace("onError +"); 
    } 
2

像剛纔的一切做與Flex中的網絡,socket.connect是異步非阻塞的,這意味着僅僅因爲sock.connect而沒有出錯,這並不意味着套接字返回實際上是準備使用呢。我懷疑,如果您在致電writeMultiByte後將trace(sock.connected)置於您的原始代碼中,它將打印false

您需要延遲sock.writeMultiByte通話,直到連接準備就緒,直到您的onConnect處理程序觸發爲止。試試:

try 
{ 
    trace("Connecting..."); 
    sock.connect("127.0.0.1", 9800);    
} 
catch(err:Error) 
{ 
    trace(err.message); 
} 
... 
public function onConnect(event:Event):void 
{ 
    trace("onConnect +"); 
    sock.writeMultiByte("GET /Connection?data=version", "us-ascii"); 
    sock.flush(); 
} 
+0

它退出有用,但我在其他地方犯錯。當我使用Get方法時,在字符串的末尾我沒有使用「\ r \ n \ r \ n」和HTTP版本。我發佈了工作代碼。謝謝大家的幫助。 –