【问题标题】:Adobe AIR HTTP Connection LimitAdobe AIR HTTP 连接限制
【发布时间】:2011-10-04 09:24:35
【问题描述】:

我正在开发一个 Adob​​e AIR 应用程序,它可以将文件上传到运行 Apache 和 PHP 的 Web 服务器。可以同时上传多个文件,应用程序也可以调用网络服务器进行各种 API 请求。

我遇到的问题是,如果我开始两个文件上传,而它们正在进行中,任何其他 HTTP 请求都会超时,这会导致应用程序出现问题,并且从用户的角度来看。

Adobe AIR 应用程序是否仅限于 2 个 HTTP 连接,或者可能是其他问题? 通过搜索这个问题我没有找到太多,但一篇文章确实表明它不仅限于两个连接。

文件上传是通过调用 File 类上传方法执行的,API 调用是使用 HTTPService 类完成的。我使用的开发 Web 服务器是 WAMP 服务器,但是当应用程序发布时,它将与 LAMP 服务器通信。

谢谢, 授予

这是我用来上传文件的代码:

protected function btnAddFile_clickHandler(event:MouseEvent):void
{
    // Create a new File object and display the browse file dialog
    var uploadFile:File = new File();
    uploadFile.browseForOpen("Select File to Upload");
    uploadFile.addEventListener(Event.SELECT, uploadFile_SelectedHandler);
}

private function uploadFile_SelectedHandler(event:Event):void
{
    // Get the File object which was used to select the file
    var uploadFile:File = event.target as File;
    uploadFile.addEventListener(ProgressEvent.PROGRESS, file_progressHandler);
    uploadFile.addEventListener(IOErrorEvent.IO_ERROR, file_ioErrorHandler);
    uploadFile.addEventListener(Event.COMPLETE, file_completeHandler);

    // Create the request URL based on the download URL
    var requestURL:URLRequest = new URLRequest(AppEnvironment.instance.serverHostname + "upload.php");
    requestURL.method = URLRequestMethod.POST;

    // Set the post parameters
    var params:URLVariables = new URLVariables(); 
    params.name = "filename.ext";
    requestURL.data = params;

    // Start uploading the file to the server
    uploadFile.upload(requestURL, "file");
}

这是 API 调用的代码:

private function sendHTTPPost(apiFile:String, postParams:Object, resultCallback:Function, initialCallerResultCallback:Function):void
{
    var httpService:mx.rpc.http.HTTPService = new mx.rpc.http.HTTPService();
    httpService.url = AppEnvironment.instance.serverHostname + apiFile;
    httpService.method = "POST";
    httpService.requestTimeout = 10;
    httpService.resultFormat = HTTPService.RESULT_FORMAT_TEXT;
    httpService.addEventListener("result", resultCallback);
    httpService.addEventListener("fault", httpFault);
    var token:AsyncToken = httpService.send(postParams);

    // Add the initial caller's result callback function to the token
    token.initialCallerResultCallback = initialCallerResultCallback;
}

【问题讨论】:

  • 我知道 AIR 应用程序可以发送的 HTTP 请求数量没有功能限制。您可以发布用于发送请求的代码吗?您是否有机会修改 HTTPService 对象的“并发”属性?
  • @JasonDean - 我更新了帖子并添加了一些代码。我不会在任何地方修改并发属性。我尝试增加 requestTimeout 但这仅意味着如果文件非常大,上传可能需要很长时间才能超时失败。谢谢。

标签: http file-upload air wamp two-connection-limit


【解决方案1】:

如果您使用的是 Windows 系统,Adobe AIR 将使用 Microsofts WinINet library 访问网络。这个库默认限制concurrent connections to a single server to 2的数量:

WinInet 限制它与单个 HTTP 服务器建立的同时连接数。如果超出此限制,请求将阻塞,直到当前连接之一完成。这是设计使然,符合 HTTP 规范和行业标准。

...与单个 HTTP 1.1 服务器的连接仅限于两个同时连接

有一个 API 可以更改此限制的值,但我不知道它是否可以从 AIR 访问。

由于此限制也会影响网站的页面加载速度,因此一些网站使用多个 DNS 名称来处理图像、javascript 和样式表等工件,以允许浏览器打开更多并行连接。

因此,如果您要控制服务器部分,解决方法可能是创建 DNS 别名,例如为上传创建 www.example.com,为 API 请求创建 api.example.com

【讨论】:

    【解决方案2】:

    所以当我研究这个时,我在文档中发现了有关使用 File.upload() 的信息:

    开始将文件上传到远程服务器。尽管 Flash Player 对您可以上传或下载的文件大小没有限制,但该播放器官方支持最大 100 MB 的上传或下载。在调用此方法之前,您必须调用 FileReference.browse() 或 FileReferenceList.browse() 方法。

    侦听器接收事件以指示上传的进度、成功或失败。虽然您可以使用 FileReferenceList 对象让用户选择多个文件进行上传,但您必须逐个上传文件;为此,请遍历 FileReference 对象的 FileReferenceList.fileList 数组。

    FileReference.upload() 和 FileReference.download() 函数是 非阻塞。这些函数在调用后返回,在 文件传输完成。此外,如果 FileReference 对象超出范围,任何尚未上传或下载的内容 在该对象上完成的操作在离开范围时被取消。确定 只要您的 FileReference 对象在范围内 预计会继续上传或下载。

    我想知道上传多个文件是否会给您带来问题。我看到您使用的是 browserForOpen() 而不是 browse()。似乎可能做同样的事情......但也许不是。

    我也在 File 类文档中看到了这一点

    请注意,由于 Flash Player 添加了新功能,因此在发布到 Flash Player 10 时,您一次只能激活以下操作之一:FileReference.browse()、FileReference.upload()、FileReference。下载(),文件参考.load(),文件参考.save()。否则,Flash Player 会引发运行时错误(代码 2174)。使用 FileReference.cancel() 停止正在进行的操作。此限制仅适用于 Flash Player 10。以前版本的 Flash Player 不受此同时进行多项操作的限制。

    当您说您让用户上传多个文件时,您是指后续调用 browse() 和 upload() 还是指一次调用包含多个文件?似乎如果您尝试进行多个单独的调用,这可能是一个问题。

    无论如何,我不知道这是否有很大帮助。看来您正在尝试做的事情应该是可能的。我只能猜测出了什么问题可能是实施的问题。祝你好运:)

    参考:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#upload()

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#browse()

    【讨论】:

    • 感谢您的回复。我尝试将调用更改为使用 browse 而不是 browseForOpen 但它没有任何区别。使用 File 类的单独实例单独选择每个文件。因为您可以让两个传输同时工作,我猜 Flash Player 10 中的“新功能”防止多个同时工作不会影响 AIR 运行时。奇怪的是,HTTPService 以及文件上传也受到影响,我有点想知道这是否可能与 apache 或 PHP 有关。
    【解决方案3】:

    因为我的一个实际应用程序出现错误,我正在考虑一个非常相似的问题,所以我决定写下我找到的答案。

    我实例化了 11

    Http连接

    并且想知道为什么我的 Flex 4 应用程序停止工作并抛出 HTTP 错误,尽管它以前工作得很好,只有 5 个同时连接到同一服务器的 HttpConnections。

    我自己对此进行了测试,因为我在 Flex 文档或互联网上没有找到任何关于此的内容。

    我发现使用超过 5 个 HTTPConnections 是 Fl​​ex 应用程序抛出运行时错误的原因。

    我决定一个接一个地实例化连接作为临时解决方法:在另一个接收数据后加载下一个连接,依此类推。 这当然只是暂时的,因为接下来的步骤之一将是更改响应服务器代码,使其响应包含请求结果的请求,而不是一个响应的表。当然,客户端应用程序逻辑也需要更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2011-05-26
      • 2014-01-12
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多