如题
小弟有个项目需要用到上述的功能,因为客户端与服务器之间使用ADSL连接,网络带宽只有512K,所以会很慢,每次传输的数据量大约为30M的文本文件,需要查看进度。
不想用FTP之类
谢谢大家
小弟有个项目需要用到上述的功能,因为客户端与服务器之间使用ADSL连接,网络带宽只有512K,所以会很慢,每次传输的数据量大约为30M的文本文件,需要查看进度。
不想用FTP之类
谢谢大家
解决方案 »
- 求高手解答:delphi中如何调用C#写的dll中的类
- 求类似360安全卫士的自动升级程序代码
- Java Delphi Socket通讯
- fastreport报表横向分页的每行标签显示问题
- 高手黑%客:网站攻防,月薪过1W
- 高分求解:FastReport中的分页小计问题
- 如何实现启动计算机就自动启动程序?如何使程序运行时图标在状态栏上显示,就象qq一样?(在线)
- 30 年内软件技术及相关问题的不变与变化
- 关于删除表的
- 紧急,一个有关类型文件的写入问题
- 请问 我用delphi7 用rave制作报表,我想在打印预览时,在报表上点右键,将报表导出到excel电子表格里。请指点!
- 我要求职!有视频!! [
TOnReceiveData = procedure (sender : Tobject;const MaxLen,CurLen : Integer) of object;首先改TSocketTransportTSocketTransport = class(TInterfacedObject, ITransport);
private
...
FMaxLen,FCurLen : integer;
FOnReceiveData : TOnReciveData;
procedure DoReceiveData;
procedure DoOnReceiveData(sender : Tobject;const MaxLen,CurLen : Integer);
...
published
...
property OnReveiceData : TOnReciveData read FOnReciveData write FOnReciveData;
end;procedure TSocketTransport.DoReciveData;
begin
DoOnReciveData(self,FMaxLen,FCurLen);
end;procedure TSocketTransport.DoOnReciveData(sender : Tobject;const MaxLen,CurLen : Integer);
begin
if Assigned(FOnReciveData) then FOnReciveData(Self,MaxLen,CurLen);
end;找到 TSocketTransport的 Receive 函数,在里面加入
function TDSocketTransport.Receive(WaitForInput: Boolean; Context: Integer): IDataBlock;
....
Result.Signature := Sig;
P := Result.Memory;
Inc(Integer(P), Result.BytesReserved);
FMaxLen := StreamLen;
FCurLen := 0;
if Fmaxlen > 0 then
DoReceiveData;
...
if RetLen > 0 then
begin
Dec(StreamLen, RetLen);
Inc(Integer(P), RetLen);
CurLen := CurLen + RetLen;
DoReceiveData;
end;
...
Fmaxlen := 0;
FCurLen := 0;
DoReceiveData;
end;
然后改 TSocketConnection TSocketConnection = class(TStreamedConnection)
private
...
FOnReceiveData : TOnReciveData;
procedure DoOnReceiveData(sender : Tobject;const MaxLen,CurLen : Integer);
published
...
property OnReveiceData : TOnReciveData read FOnReceiveData write FOnReceiveData;
end;procedure TSocketConnection.DoOnReceiveData(sender : Tobject;const MaxLen,CurLen : Integer);
begin
if Assigned(FOnReceiveData) then FOnReceiveData(Self,MaxLen,CurLen);
end;然后改这个部分,在里面最后加上红色部分
function TDSockConnect.CreateTransport: ITransport;
....
SocketTransport.OnReveiceData := DoOnReceiveData;
end;原理基本上就是这样,自己可以灵活掌握,也可以重新写个控件。
Client Codeprocedure DownFile();
const
c_PackLen = $1000; //1K
var
SResponse : String;
fStream : TFileStream;
dcStream : TDecompressionStream; fSize : Integer;
iRcvLen : Integer;
begin
with TCPClient do
begin
Connect; while Connected do
begin
fStream := TFileStream.Create(FileName, fmCreate or fmOpenWrite);
try
//Decompression
dcStream := TDecompressionStream.Create(fStream);
try
// banner means the server thread is running
SResponse := UpperCase(ReadLn);
if Pos('BEG', SResponse) = 0 then Break; fSize := StrToInt(Copy(SResponse, 4, Length(SResponse) - 3));
//Progress
pbDown.Max := fSize;
pbDown.Postion := 0; repeat
// request file data
WriteLn('SENDFILE'); { read all bytes until disconnected
length er in stream }
iRcvLen := ReadInteger();
ReadStream(dcStream, iRcvLen, True); pbDown.Postion := pbDown.Postion + iRcvLen; until iRcvLen < c_PackLen; finally
dcStream.Free;
end;
finally
Disconnect;
fStream.Free;
end;
end;
end;
end;
Server Codeprocedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
const
c_PackLen = $1000; //1K
var
fStream : TFileStream;
cStream : TCompressionStream; iSendLen: Integer;
begin
with AThread.Connection do
begin
fStream := TFileStream(FileName, fmOpenRead or fmShareDenyNone);
try
//Compression
cStream := TCompressionStream.Create(clFastest, fStream);
try
WriteLn('BEG' + IntToStr(fStream.Size)); repeat
iSendLen := Min(c_PackLen, fStream.Size - fStream.Postion); OpenWriteBuffer;
try
WriteStream(cStream, False, True, iSendLen);
finally
CloseWriteBuffer;
end;
until iSendLen < c_PackLen;
finally
cStream.Free;
end;
finally
Disconnect;
fStream.free;
end;
end;
end;
不用INDY,必须用socketconnection实现