Предел HTTP-соединения Adobe AIR - PullRequest
       17

Предел HTTP-соединения Adobe AIR

1 голос
/ 04 октября 2011

Я работаю над приложением Adobe AIR, которое может загружать файлы на веб-сервер под управлением Apache и PHP. Несколько файлов могут быть загружены одновременно, и приложение также вызывает веб-сервер для различных запросов API.

Проблема, с которой я сталкиваюсь, заключается в том, что если я начну две загрузки файлов, в то время как они выполняются, то истечет время ожидания любых других HTTP-запросов, что создает проблему для приложения и с точки зрения пользователя.

Ограничены ли приложения Adobe AIR 2-мя HTTP-соединениями, или, возможно, проблема связана с чем-то другим? От поиска по этой проблеме я не нашел много, но одна статья действительно указала, что это не было ограничено только двумя связями.

Загрузка файлов выполняется путем вызова метода загрузки классов файлов, а вызовы API выполняются с использованием класса HTTPService. Веб-сервер разработки, который я использую, является сервером 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;
}

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Если вы работаете в системе Windows, Adobe AIR использует Microsoft WinINet для доступа к Интернету.Эта библиотека по умолчанию ограничивает число одновременных подключений к одному серверу 2 :

WinInet ограничивает количество одновременных подключений к одному HTTP-серверу.Если вы превысите этот предел, запросы блокируются до тех пор, пока одно из текущих подключений не будет завершено.Это разработано и согласуется со спецификацией HTTP и отраслевыми стандартами.

... Соединения с одним сервером HTTP 1.1 ограничены двумя одновременными соединениями

СуществуетAPI для изменения значения этого ограничения, но я не знаю, доступен ли он из AIR.

Поскольку это ограничение также влияет на скорость загрузки страниц для веб-сайтов, некоторые сайты используют несколько DNS-имен для таких артефактов, как:изображения, javascripts и таблицы стилей, позволяющие браузеру открывать больше параллельных соединений.

Поэтому, если вы управляете серверной частью, обходным путем может быть создание псевдонимов DNS, таких как www.example.com для загрузки и api.example.com для APIзапросы.

0 голосов
/ 05 февраля 2016

Только потому, что я думал об очень похожем вопросе из-за ошибки в одном из моих реальных приложений, я решил записать найденный ответ.

Я создал экземпляр 11

HttpConnections

и мне было интересно, почему мое приложение Flex 4 перестало работать и выдало ошибку HTTP, хотя раньше она работала довольно хорошо, имея всего 5 одновременных соединений HttpConnections на одном сервере.

Я проверял это сам, потому что ничего не нашел в документах Flex или в Интернете.

Я обнаружил, что использование более 5 HTTPConnections было причиной для приложения Flex выброситьошибка времени выполнения.

Я решил создать соединения одно за другим в качестве временного решения: загрузить следующее, после того как другое получит данные, и так далее.Это, конечно, просто временно, поскольку одним из следующих шагов будет изменение отвечающего серверного кода таким образом, чтобы он отвечал на запрос, содержащий результаты запросов, на более чем одну таблицу в одном ответе.Конечно, логику клиентского приложения тоже нужно изменить.

0 голосов
/ 04 октября 2011

Итак, когда я изучал это, я наткнулся на информацию об использовании File.upload () в документации:

Начинает загрузку файла на удаленный сервер.Хотя Flash Player не имеет ограничений по размеру файлов, которые вы можете загружать или загружать, он официально поддерживает загрузку или загрузку до 100 МБ.Прежде чем вызывать этот метод, необходимо вызвать метод FileReference.browse () или FileReferenceList.browse ().

Слушатели получают события, указывающие на прогресс, успех или неудачу загрузки.Хотя вы можете использовать объект FileReferenceList, чтобы позволить пользователям выбирать несколько файлов для загрузки, вы должны загружать файлы по одному;для этого переберите массив FileReferenceList.fileList объектов FileReference.

Функции FileReference.upload () и FileReference.download () неблокируют.Эти функции возвращаются после вызова, до завершения передачи файла.Кроме того, если объект FileReference выходит из области действия, любая загрузка или загрузка, которая еще не завершена для этого объекта, отменяется при выходе из области действия.Убедитесь, что ваш объект FileReference остается в области действия до тех пор, пока ожидается, что загрузка или выгрузка будут продолжаться.

Интересно, могут ли что-то возникать проблемы с загрузкой нескольких файлов.Я вижу, что вы используете browserForOpen () вместо browse ().Кажется, что, вероятно, делают то же самое ... но, возможно, нет.

Я также видел это в документации класса File

Обратите внимание, что из-за новой функциональности, добавленной в Flash Player, при публикации в Flash Player 10 вы можете иметь только один изследующие операции, активные одновременно: FileReference.browse (), FileReference.upload (), FileReference.download (), FileReference.load (), FileReference.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()

...