2013-07-16 1 views
0

У меня есть программа на C, которая запускает веб-сервер. У меня есть Air Application, и я хочу общаться с этим веб-сервером с помощью Air Application. Я создаю объект сокета и делаю следующее.Http-связь с C-приложением

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

Я допустил ошибку. Я не добавлял HTTP-версию и ограничитель строк в Get String. То почему я не получал никакой печати на стороне сервера. Потому что запрос был недействительным. Я опубликовал рабочий код. Спасибо за помощь.

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 вернулся без ошибок, это не значит, что сокет фактически готов к использованию. Я подозреваю, что если вы поместите trace(sock.connected) в свой первоначальный код после вашего звонка на writeMultiByte, он напечатает 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. Я публикую рабочий код. Спасибо всем за вашу помощь. –