0

我有一个 C 程序,它运行一个 Web 服务器。我有一个 Air 应用程序,我想使用 Air Application 与该 Web 服务器进行通信。我创建一个套接字对象并执行以下操作。

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 +");
    }

socket 连接成功并触发其连接事件。但是当我尝试请求连接 url 时,服务器端没有收到任何内容。我错过了什么吗?谢谢

4

2 回答 2

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();
}
于 2013-07-17T14:54:58.433 回答
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 +");
    }
于 2013-07-19T05:19:12.903 回答