使用Flash / Adob​​e Air 2.0套接字很困难

时间:2010-06-23 08:40:25

标签: flex flash air flex3

我正在尝试将一些数据写入原始数据套接字(大约22 MB)。场景是这样的: -

  1. 打开本地文件
  2. 读一大块字节。
  3. 将其写入套接字
  4. 重复2& 3直到文件结束。
  5. 现在的问题是我的代码(下面)没有传输完整的文件。它使用我的测试文件传输了22 MB的3个。然而,跟踪已完成并显示正在传输的完整数据。我怀疑它可能会在完成当前一个块之前开始编写下一个块(虽然我不确定)。

    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();
    

    以上是我应该使用的代码。我想知道我是做对还是错。

    在写入迭代之间插入强制延迟可确保完整传输文件,如下面的代码段所示。然而,这不是可接受的解决方案。我想知道是否有一些我应该订阅的事件,或者是否需要以不同方式完成任何事情。另一端的服务器是FileZilla FTP Server。

    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 :(得分:0)

由于AIR具有残酷的套接字关闭操作,因此需要修改服务器以让客户端知道它何时收到所有已发送的数据(通过另一个TCP控制套接字)。当然,客户端需要在一开始就传递它发送的数据量。

答案 1 :(得分:0)

我正在等待数据完全写入时触发的套接字事件... :(

第一个想法是在每次write()之后加一个延迟。但是,如果连接非常好,由于延迟,传输时间会更长。并且在连接速度慢的情况下,延迟并不总是足够的,因此一些数据仍然可能丢失:(

我发现的唯一一个解决方案并不合适但有效。我正在使用proftpd作为FTP服务器和我编写的MOD,它允许一个新的FTP命令:FILESIZE。 此命令以八位字节为单位给出文件路径的大小。

然后,在flex中,我打开了2个套接字:一个用于传输数据,一个用于获取文件大小。 在第一个套接字上每次调用write()之后,我在第二个套接字上使用FILESIZE获取文件的大小。

硬币的另一面是由于FILESIZE(:/)的FTP调用,传输需要很长时间,但传输更可靠。

这种问题可能会从Flex转移到Java。 Alomost两年的问题发布在Adobe Bug页面上,并且......没有...... 有没有办法在flex的核心添加此功能?我不这么认为,flash不是开源的......