问题描述
我想使用Indy TCP以最大可能的速度通过Internet连接发送一些(大)文件。我写了一个简单的应用程序来测试Indy TCP Client-Server连接的工作方式。
我发现的是:
因此,这意味着要写入的套接字上有一个传输缓冲区。看起来它可以具有任何大小...如果我写大量数据(比如说100 MB),我认为它不是在单个操作中传输的,而是在小的块中(比如说1 MB)传输的。因此,随着数据的传输,当所有数据都被传输时,该缓冲区会缩小直到达到零。我需要的是随时知道该缓冲区何时需要填充的缓冲区的长度,因此我可以连续写而不会占用整个计算机内存。
我不知道我在这里写的内容是否有意义...如果没有,请告诉我删除该问题并提出一个更一般的问题。最后,我想要的是通过Indy TCP连接以最快的速度(意味着异步)发送文件,但带有进度条和取消按钮。
这是测试应用程序:
procedure TClient.Execute;
var Cmd: Cardinal;
Txt: String;
Buff: TIdBytes;
Size: Integer;
begin
Size:= 5000000;
SetLength(Buff,Size);
Buff[0]:= 33;
Buff[Size-1]:= 55;
Client.Connect;
Cmd:= 1234;
Client.socket.Write(Cmd);
Client.socket.Write(Size);
Client.socket.Write(Buff);
Txt:= 'client finished transmision';
SendMessage(RWnd,WM_USER,WParaM(@Txt),0);
Client.disconnect;
Txt:= 'client disconected';
SendMessage(RWnd,0);
end;
procedure TForm1.ServerExecute(AContext: TIdContext);
var Cmd: Cardinal;
Mess: String;
Buff: TIdBytes;
Size: Integer;
begin
Mess:= 'Server ready';
SendMessage(Handle,WParaM(@Mess),0);
Cmd:= AContext.Connection.socket.ReadUInt32;
Mess:= 'Server receive command';
SendMessage(Handle,0);
if Cmd = 1234 then begin
Size:= AContext.Connection.socket.ReadInt32;
Sleep(4000);
Mess:= 'Server start reading';
SendMessage(Handle,0);
AContext.Connection.socket.ReadBytes(Buff,Size);
Mess:= IntToStr(Buff[0]) + ' / ' + IntToStr(Buff[Size-1]);
SendMessage(Handle,0);
end;
Mess:= 'Server closed connection';
SendMessage(Handle,0);
end;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)