Sockets 通过FTP上传时,您可以多久写入一次套接字?

Sockets 通过FTP上传时,您可以多久写入一次套接字?,sockets,ftp,Sockets,Ftp,我正在开发一个集成的FTP上传模块,使用在线代码,我发现此方法每隔300毫秒调用一次: var uploadInterval:int = 300; var bufferSize:uint = 4096; private function sendData():void { var sourceBytes:ByteArray = new ByteArray(); sourceFile.readBytes(sourceBytes, 0, bufferSize); pass

我正在开发一个集成的FTP上传模块,使用在线代码,我发现此方法每隔300毫秒调用一次:

var uploadInterval:int = 300;
var bufferSize:uint = 4096;

private function sendData():void {
    var sourceBytes:ByteArray = new ByteArray();
    sourceFile.readBytes(sourceBytes, 0, bufferSize);

    passiveSocket.writeBytes(sourceBytes, 0, sourceBytes.bytesAvailable);
    passiveSocket.flush();

    if (sourceFile.bytesAvailable < bufferSize) {
        bufferSize = sourceFile.bytesAvailable;
    }
}

interval = setInterval(sendData, uploadInterval);

如果套接字阻塞,通常默认情况下,您可以尽可能快地写入,write()调用将阻塞,直到操作系统可以接收更多数据


因此,我不知道为什么您发现的代码在write()调用之间等待了几毫秒,在一般情况下,您可以循环并发送所有可用的数据,而无需等待。操作系统负责在需要时阻止发件人。

在阻止模式下,您可以随心所欲地写。管道装满时,它会堵塞。根本不需要休息。好的。我在网上发现有人说这是为了让他们能够获得进展。如果您分块上传,您可以跟踪字节数组的位置。@1.21gigawatts您将获得这些数据,间隔为实际写入发送数据所需的时间。缓冲区越大,事件发生的频率越低。额外的等待简直是浪费时间。从套接字处理事件?嗯,如果我想频繁地获取事件,我可以增加缓冲区大小吗?是4096吗?是的,这简直是浪费时间!我继续访问asdocs,发现发送了一个新的进度事件,可能正是出于此目的。因此,我可以一次性发送所有数据,但仍然可以获取事件。
private function sendBlockData():void {

    var bytes:int;
    var sourceBytes:ByteArray = new ByteArray();
    sourceFile.readBytes(sourceBytes, bytes, Math.min(bufferSize, sourceFile.bytesAvailable - bytes));
    bytes += bufferSize;
    bufferSize = Math.min(bufferSize, sourceFile.bytesAvailable - bytes);

    passiveSocket.writeBytes(sourceBytes, 0, sourceBytes.bytesAvailable);
    passiveSocket.flush();

}