Сложность использования Flash / Adobe Air 2.0 Sockets - PullRequest
1 голос
/ 23 июня 2010

Я пытаюсь записать некоторые данные в сокет необработанных данных (около 22 МБ). Сценарий такой: -

  1. Открыть локальный файл
  2. Чтение фрагмента байтов.
  3. Запишите это в сокет
  4. Повторяйте 2 и 3 до конца файла.

Теперь проблема в том, что мой код (ниже) не передает полный файл. Это передает, возможно, 3 из 22 МБ с моим тестовым файлом. Однако трассировка завершена и показывает полные передаваемые данные. Я подозреваю, что, возможно, он начинает писать следующий блок перед завершением текущего (хотя я не уверен).

while(fs.bytesAvailable > 0){
    var readAmount = (fs.bytesAvailable < socketBufferSize) ? fs.bytesAvailable : socketBufferSize;
    seq++;
    air.trace(">"+seq+" WritePacket "+readAmount+" "+fs.position+" "+fs.bytesAvailable);
    fs.readBytes(bytes, 0, readAmount);
    air.trace(bytes.length);
    socket2.writeBytes(bytes, 0, bytes.length);
    socket2.flush();
}
fs.close();
socket2.close();

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

Вставка принудительной задержки между итерациями записи гарантирует, что файл будет полностью передан, как указано во фрагменте ниже. Однако это не приемлемое решение. Я хотел бы знать, есть ли какое-то событие, на которое я должен подписаться или что-то нужно сделать по-другому. Сервер на другом конце - FTP-сервер FileZilla.

var sendData = function (){
    if(fs.bytesAvailable > 0){
    var readAmount = (fs.bytesAvailable < socketBufferSize) ? fs.bytesAvailable : socketBufferSize;
    seq++;
    air.trace(">"+seq+" WritePacket "+readAmount+" "+fs.position+" "+fs.bytesAvailable);
    fs.readBytes(bytes, 0, readAmount);
    air.trace(bytes.length);
    socket2.writeBytes(bytes, 0, bytes.length);
    socket2.flush();
    }
    else{
        air.trace("Closing Connection");
        fs.close();
        socket2.close();
    }
}
var interval = setInterval(sendData, 100);

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

Уже давно я жду события сокета, инициируемого, когда данные полностью записываются ...: (

Первая идея - установить задержку после каждой записи (). Однако вв случае действительно хорошего соединения передача длиннее из-за задержки. А в случае медленного соединения задержка не всегда достаточна, и поэтому некоторые данные все еще могут быть потеряны: (

Единственное решение, которое яЯ обнаружил, что это не совсем правильно, но работает. Я использую proftpd в качестве FTP-сервера с написанным мною MOD, который позволяет новую команду FTP: FILESIZE. Эта команда задает размер пути к файлу в октетах.

Затем во flex у меня открыты 2 сокета: один для передачи данных, один для получения размера файла. После каждого вызова write () на первом сокете я получаю размер файла с помощью FILESIZE на второмсокет.

Другая сторона медали в том, что передача занимает много времени из-за FTP-вызовов FILESIZE (: /), но передача более надежна.

Это тип oЭта проблема, вероятно, переместится из Flex в Java.Почти два года этой проблемы размещаются на страницах ошибок Adobe, и ... ничего ... Есть ли способ добавить эту функцию в ядро ​​flex?Я так не думаю, flash не с открытым исходным кодом ...

0 голосов
/ 24 июня 2010

Поскольку AIR имеет жесткую операцию закрытия сокета, необходимо изменить сервер, чтобы клиент знал, когда он получил все отправленные данные (через другой сокет управления TCP).Конечно, клиент должен передать, сколько данных он отправляет в начале.

...