Adobe AIR HTTP连接限制



我正在开发一个Adobe AIR应用程序,它可以将文件上传到运行Apache和PHP的web服务器。可以同时上传多个文件,并且应用程序还可以调用web服务器进行各种API请求。

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

是Adobe AIR应用程序限制为2个HTTP连接,还是其他可能的问题?通过对这个问题的搜索,我没有发现太多,但有一篇文章表明,它并不局限于两个连接。

文件上传是通过调用file类的upload方法来执行的,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;
}

如果您在windows系统上,Adobe AIR正在使用microsoft WinINet库访问web。默认情况下,此库将到单个服务器的并发连接数限制为2:

WinInet限制了它对单个HTTP服务器的同时连接数。如果超过了这个限制,请求就会阻塞,直到其中一个当前连接完成。这是经过设计的,并且符合HTTP规范和行业标准。

…到单个HTTP 1.1服务器的连接被限制为两个同时连接

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

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

因此,如果你控制服务器部分,一个解决方案可以是创建DNS别名,如www.example.com用于上传和api.example.com用于API请求。

所以当我在寻找这个,我遇到了这个信息关于使用File.upload()在文档:

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

侦听器接收事件以指示上传的进度、成功或失败。虽然你可以使用FileReferenceList对象让用户选择多个文件进行上传,但你必须一个一个地上传文件;为此,迭代FileReferenceList。filerreference对象的fileList数组。

FileReference.upload()和FileReference.download()函数是非阻塞。这些函数在被调用之后返回文件传输完成。另外,如果filerreference对象超出作用域,任何尚未超出作用域的上载或下载该对象上的Completed在离开作用域时被取消。一定你的filerreference对象在作用域中保留的时间只要上传或下载预计将继续。

我想知道是否有什么东西会给你上传多个文件的问题。我看到您正在使用browserForOpen()而不是browse()。看起来他们可能会做同样的事情……但也许不是。

我在File类文档

中也看到了这一点

请注意,由于新功能添加到Flash Player,当发布到Flash Player 10,你只能有以下操作中的一个活动在同一时间:FileReference.browse(), FileReference.upload(), FileReference.download(), FileReference.load(), FileReference.save()。否则,Flash Player抛出运行时错误(代码2174)。使用filerreference .cancel()停止正在进行的操作。此限制仅适用于Flash Player 10。先前版本的Flash Player不受此同时多个操作的限制。

当你说你允许用户上传多个文件时,你是指随后调用browse()和upload()还是指一次调用包含多个文件?似乎,如果你试图做多个单独的电话,这可能是一个问题。

无论如何,我不知道这是否有多大帮助。显然,你想做的事情应该是可能的。我只能猜测,出了什么问题,也许是一个问题的执行。祝你好运:)

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

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

只是因为我在考虑一个非常类似的问题,因为我的一个实际应用程序中的一个错误,我决定写下我找到的答案。

我实例化了11

HttpConnections

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

我自己测试了这个,因为我在Flex文档或互联网上没有找到任何关于这个的东西。

我发现使用超过5个HTTPConnections是Flex应用抛出运行时错误的原因。

我决定一个接一个地实例化连接,作为暂时的解决方案:在另一个接收到数据后加载下一个,等等。当然,这只是暂时的,因为接下来的步骤之一将是改变响应服务器代码,以便它在一个响应中响应包含多个表的请求结果的请求。当然,客户端应用程序逻辑也需要修改。

相关内容

  • 没有找到相关文章

最新更新