J'essaie d'écrire des données dans un socket de données brutes (environ 22 Mo). Le scénario est tel: -Difficulté à utiliser les sockets Flash/Adobe Air 2.0
- Ouvrir fichier local
- Lire un morceau d'octets.
- Ecrivez-le sur le socket
- Répétez 2 & 3 jusqu'à la fin du fichier.
Maintenant le problème est que mon code (ci-dessous) ne transfère pas le fichier complet. Il transfère peut-être 3 sur les 22 Mo avec mon fichier de test. La trace est cependant complète et montre des données complètes en cours de transmission. Je soupçonne que peut-être il commence à écrire le morceau suivant avant de finir le courant (bien que je ne sois pas sûr).
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();
Ci-dessus est le code que je suis censé utiliser. Je voudrais savoir si je fais quelque chose de bien ou de mal.
L'insertion d'un délai forcé entre les itérations d'écriture garantit que le fichier est transféré complètement indiqué dans l'extrait ci-dessous. Cependant, ce n'est pas une solution acceptable. Je voudrais savoir s'il y a un événement auquel je devrais être abonné ou si quelque chose doit être fait différemment. Le serveur à l'autre extrémité est le serveur 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);
Merci
Apparemment, le problème réside dans le fait que la fonction de fermeture de socket est brutale. Il ferme prématurément le canal avant qu'il ait une chance de transférer toutes les données. Si je supprime le socket.close() et attendez qu'il expire il fonctionne correctement. Y a-t-il une manière correcte recommandée pour faire ceci? –
Oh et si ce problème vous afflige, alors s'il vous plaît voter pour ce numéro: http://bugs.adobe.com/jira/browse/FP-6 –
Ce problème a été confirmé par l'équipe de l'air sur le groupe google étanche à l'air . Heres le message transféré: - Le problème que vous rencontrez ici est que si vous appelez close() trop tôt, les données qui n'ont pas encore été transmises sont rejetées et le socket est immédiatement fermé. C'est pourquoi l'insertion d'un retard fonctionne: il donne le temps pour les données à transmettre avant d'appeler close(). Nous (l'équipe AIR) sommes conscients qu'il s'agit d'un problème d'utilisabilité plutôt important dans cette API, et nous travaillons à y remédier. En attendant, je crois qu'un délai est votre meilleure option. Cordialement, Oliver –