Delphi实现Ftp客户端下载(支持断点续传,多线程传输)

简介:

以前写的一个ftp客户端下载的玩意!支持了断点续传,多线程传输等(实际上并非是一个真正多线程的传输与下载模式,是一个伪多线程方式,仅仅是多开ftp端口,连接上之后从指定的数据段位置开始下载,所以要想真正意义上实现一个多线程的模式还是需要在服务器端做相应的处理才能实现!)代码写的很简陋,仅仅提供了一个DownLoad方法,传递一个Ftp格式的URL然后解析出实际地址与文件名等开始实现下载!大致代码:

复制代码

  
  
{ ******************************************************* }
{ }
{ 得闲工作室 Ftp客户端下载控件单元 }
{ FtpClient }
{ 作者: 不得闲 2009年2月25日, 9:09:04 }
{ }
{ ******************************************************* }

unit FtpClient;

interface
uses Windows,Classes,SysUtils,StrUtils,ScktComp,WinInet, Messages,Forms,IniFiles;

type
TDxFtpClient
= class ;

TDxSockState
= (Ds_DataOk,Ds_UserTerminate,Ds_DataErr);

TReadWriteThread
= class (TThread)
private
FDataSocket: TClientSocket;
Owner: TDxFtpClient;
SocketDataStream: TWinSocketStream;
procedure DownLoad;
procedure UpLoad;
protected
procedure Execute; override ;
procedure UpdateProgress;
public
constructor Create(bSuspend:Boolean;AOwnerFtp: TDxFtpClient;Host: string ;Port: Word);
destructor Destroy; override ;
end ;

TDxFtp
= class ;


{ FTP的双线连接,数据连接与命令连接 }
TDxFtpClient
= class (TComponent)
private
FCmdSocket: TClientSocket;
// 数据连接与命令连接
DataStream: TMemoryStream;
protected
DataSize,ReadySize: Int64;
OwnerFtp: TDxFtp;
SocketIndex: Integer;
ReadWriteThread: TReadWriteThread;
User,PassWord,DirName,FileName,Host:
string ;
ConPort: Word;
procedure DoCmdSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure DoCmdSocketError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure DoReadWriteEnd(Sender: TObject);
public
constructor Create(AOwner: TComponent); override ;
destructor Destroy; override ;
procedure Open;
end ;


// 下载开始事件,Conindex指定下载的线程号,startPos和TotalSize分别指定下载开始位置和总数据量
TOnDownStartEvent
= procedure (sender:TObject;conindex: integer;startPos,totalSize:Int64) of object ;
// 进度事件,分别指定为当前进度,以及下载速度
TOnProgressEvent
= procedure (Sender: TObject;Const FileReadySize,FileTotalSize: int64; const Progress: Single; const ReadWriteRate: Single) of object ;
// 上传下载完成时候触发的事件,ReadyState指定完成的状态
TOnUpDownReadyEvent
= procedure (Sender: TObject; const FileReadySize,FileTotalSize: Int64; const ReadyState: TDxSockState) of object ;
// 在下载和上传时,SockStream在读取和写入数据失败的时候触发的事件!WaitAgain表示是否继续等待下一次读取和写入,默认是不等待,
// 如果不等待,则直接中止数据传输,否则一直等待直到有数据读取和写入
// 如果不指定该事件,自动检测10次,如果超过10没有读取或写入数据,代表异常,传输数据中止

TSocketError
= procedure (Sender: TObject;ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object ;

TReadWritDataErrEvent
= procedure (Sender: TObject; var WaitAgain: Boolean { 继续等待 } ) of object ;
TDxFtp
= class (TComponent)
private
FThreadCount: Integer;
FtpSocketArr:
array of TDxFtpClient;
Ini: TMemIniFile;
FileTotalSize: Int64;
FOnDownStart: TOnDownStartEvent;
FOnProgress: TOnProgressEvent;
ReadyCount: Integer;
// 执行完成的数量
DownStartTick: DWORD;
BeginSize: Int64;
SaveFileName:
string ;
UserTerminated: Boolean;
// 用户终止
CriticalSection: TRTLCriticalSection;
// 创建一个临界区
FileStream: TFileStream;
SaveFileIntime: Boolean;
// 实时保存数据文件
IsUpLoad: Boolean;
FOnUpDownReady: TOnUpDownReadyEvent;
SockState: TDxSockState;
FOnReadWriteDataError: TReadWritDataErrEvent;
FOnSocketError: TSocketError;
procedure SetThreadCount( const Value: Integer);
function GetActive: Boolean;
procedure DownReady; // 全部完成,文件合并
procedure Ready;
public
constructor Create(AOwner: TComponent); override ;
destructor Destroy; override ;
property ThreadCount: Integer read FThreadCount write SetThreadCount default 2 ; // 线程数量
procedure Suspend; // 暂停
procedure Resume; // 继续
procedure Terminate; // 终止数据传输
property Active: Boolean read GetActive; // 是否活动
procedure DownLoad( const FptUrl: string ;SaveToFile: string ; const SaveInTime: Boolean = False); // 下载
procedure UpLoad( const FileName,FtpUrl: string );
procedure SaveCfg(CfgFile: string ); // 生成配置文件
property OnDownStart: TOnDownStartEvent read FOnDownStart write FOnDownStart;
property OnProgress: TOnProgressEvent read FOnProgress write FOnProgress;
property OnUpDownReady: TOnUpDownReadyEvent read FOnUpDownReady write FOnUpDownReady;
property OnReadWriteDataError: TReadWritDataErrEvent read FOnReadWriteDataError write FOnReadWriteDataError;
property OnSocketError: TSocketError read FOnSocketError write FOnSocketError;
end ;

function CheckFileName( const FileName: string ): string ;
function RightPos(Const SubStr,Str: string ; const index: integer =- 1 ): integer;
implementation
const
RecvTmpBufSize
= 64 * 1024 ;
end .
复制代码

本文转自 不得闲 博客园博客,原文链接:   ,如需转载请自行联系原作者http://www.cnblogs.com/DxSoft/archive/2010/02/08/1666100.html   ,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 Shell Linux
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
144 0
|
6月前
Socket网络编程练习题四:客户端上传文件(多线程版)
Socket网络编程练习题四:客户端上传文件(多线程版)
|
Unix Shell Linux
客户端如何查找FTP服务器的用户名和密码
客户端如何查找FTP服务器的用户名和密码
|
安全 数据安全/隐私保护
直播系统源码部署,高效文件管理与传输的FTP协议
在直播系统源码部署后的每天要处理大量媒体文件的情况下,FTP协议可以依靠自身的强大文件传输管理机制、备份与恢复与自动化任务来帮助平台用户更好的操作体验,通过FTP协议,也确保直播系统源码媒体文件传输的可靠性与安全性,让直播系统源码成为了更优质的平台。
直播系统源码部署,高效文件管理与传输的FTP协议
|
6月前
|
Java
Socket网络编程练习题五:客户端多用户上传文件(多线程版)并使用线程池管理线程
Socket网络编程练习题五:客户端多用户上传文件(多线程版)并使用线程池管理线程
|
1月前
|
网络安全 Windows
Jetson 学习笔记(十五):FTP协议传输文件
本文介绍了如何使用WinSCP软件通过FTP协议在Windows和Jetson设备之间传输文件,并分享了一些操作经验和技巧。
29 0
Jetson 学习笔记(十五):FTP协议传输文件
|
5月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
103 0
|
3月前
|
Java
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
84 1
|
3月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
56 6
|
4月前
|
Java Redis 数据安全/隐私保护
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码